{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 时间序列（time series） 数据是一种重要的结构化数据形式， \n",
    "#     应用于多个领域， 包括金融学、 经济学、 生态学、 神经科学、 物理学等。 \n",
    "\n",
    "# 在多个时间点观察或测量到的任何事物都可以形成一段时间序列。 \n",
    "# 很多时间序列是固定频率的， 也就是说， 数据点是根据某种规律定期出现的（比如每15秒、每5分钟、每月出现一次）\n",
    "#    时间序列也可以是不定期的， 没有固定的时间单位或单位之间的偏移量。 \n",
    "\n",
    "# 时间序列数据的意义取决于具体的应用场景， 主要有以下几种：\n",
    "#     1、时间戳（timestamp） ， 特定的时刻。\n",
    "#     2、固定时期（period） ， 如2007年1月或2010年全年。\n",
    "#     3、时间间隔（interval） ， 由起始和结束时间戳表示。 时期（period） 可以被看做间隔（interval） 的特例。\n",
    "#     4、实验或过程时间， 每个时间点都是相对于特定起始时间的一个度量。 例如， 从放入烤箱时起，每秒钟饼干的直径。\n",
    "\n",
    "# 许多技术都可用于处理实验型时间序列， 其索引可能是一个整数或浮点数（表示从实验开始算起已经过去的时间）\n",
    "# \n",
    "#  最简单也最常见的时间序列都是用时间戳进行索引的\n",
    "\n",
    "# 提示： pandas 也支持基于 timedeltas 的指数， 它可以有效代表实验或经过的时间\n",
    "#       timedelta 指数，可以学习 pandas 的文档 （http://pandas.pydata.org/）\n",
    "\n",
    "# pandas 提供了许多内置的时间序列处理工具和数据算法\n",
    "#       可以高效处理非常大的时间序列， 轻松地进行切片/切块、 聚合、 \n",
    "#          对定期/不定期的时间序列进行重采样等。 \n",
    "\n",
    "# 有些工具特别适合金融和经济应用，当然也可以用它们来分析服务器日志数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 6, 25, 18, 33, 18, 2975)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 日期和时间数据类型以及工具\n",
    "\n",
    "# Python 标准库包含于日期（date）和时间（time）数据的数据类型，还有日历方面的功能\n",
    "# 主要模块 datetime、time、calendar\n",
    "# datetime.datetime (简写 datetime ) 用到最多数据类型\n",
    "\n",
    "from datetime import datetime\n",
    "\n",
    "now = datetime.now()\n",
    "\n",
    "now"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2020, 6, 25)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "now.year, now.month, now.day"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.timedelta(days=926, seconds=56700)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# datetime 以毫秒形式储存日期和时间\n",
    "# timedelta 表示两个 datetime 对象之间的时间差\n",
    "\n",
    "delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)\n",
    "\n",
    "delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "926"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "delta.days"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "56700"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "delta.seconds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2011, 1, 19, 0, 0)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以给 datetime 对象加上或者减去一个或者多个 timedelta ，这样会产生一个新的对象\n",
    "from datetime import timedelta\n",
    "\n",
    "start = datetime(2011, 1, 7)\n",
    "start + timedelta(12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2010, 12, 14, 0, 0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "start - 2 * timedelta(12)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# datetime 模块中的数据类型参见下表\n",
    "# datetime模块中的数据类型\n",
    "\n",
    "# 类型        说明\n",
    "# date        以公历形式存储日历日期(年、月、日)\n",
    "# time        将时间存储为时、分、秒、毫秒\n",
    "# datetime    存储日期和时间\n",
    "# timedelta   表示两个datetime值之间的差(日、秒、毫秒)\n",
    "\n",
    "# tzinfo 存储时区信息的基本类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2011-01-03 00:00:00'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 字符串 和 datetime 的相互转换\n",
    "\n",
    "# 利用 str 或者 strtime 方法（传入一个格式化字符串），\n",
    "#    则 datetime 对象 和 pandas 的 Timestamp 对象可以被格式化为字符串\n",
    "stamp = datetime(2011, 1, 3)\n",
    "str(stamp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2011-01-03'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stamp.strftime('%Y-%m-%d')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 下表列出了全部的格式化编码\n",
    "# datetime 格式定义（兼容 ISO C89）\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![self](./../image/datetime.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2011, 1, 3, 0, 0)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "value = '2011-01-03'\n",
    "\n",
    "datetime.strptime(value, '%Y-%m-%d')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datestrs = ['7/6/2011', '8/6/2011']\n",
    "\n",
    "[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2011, 1, 3, 0, 0)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# datetime.strptime 是通过已知格式进行日期解析的最佳方式\n",
    "#  但是每次都要编写格式定义是很麻烦的事情，尤其是对于一些常见的日期格式\n",
    "# 这种情况下， 可以用 dateutil 这个第三方包中的 parser.parse 方法（pandas中已经自动安装好了）\n",
    "from dateutil.parser import parse\n",
    "\n",
    "parse('2011-01-03')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(1997, 1, 31, 22, 45)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# dateutil 可以解析几乎所有人类能够理解的日期表示形式：\n",
    "parse('Jan 31, 1997 10:45 PM')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2011, 12, 6, 0, 0)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在国际通用的格式中， 日出现在月的前面很普遍， 传入 dayfirst=True 即可解决这个问题：\n",
    "parse('6/12/2011', dayfirst=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# pandas 通常是用于处理成组日期的，不管这些日期是 DataFrame 的轴索引还是列\n",
    "#   to_datetime 方法可以解析多种不同的日期表示形式\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# 对标准日期格式（如 ISO8601）的解析非常快：\n",
    "datestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']\n",
    "pd.to_datetime(datestrs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 还可以处理 缺失值（ None， 空字符串 等等）\n",
    "idx = pd.to_datetime(datestrs + [None])\n",
    "\n",
    "idx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NaT"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# NaT（Not a Time） 是 pandas 中时间戳数据的 null 值。\n",
    "# 注意： dateutil.parser 是一个实用但不完美的工具\n",
    "#    比如说，它会把一些原本不是日期的字符串认作是日期（比如\"42\"会被解析为2042年的今天）\n",
    "idx[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False,  True])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.isnull(idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# datetime 对象还有一些特定于当前环境（位于不同国家或者使用不同语言的系统）的格式化选项\n",
    "# 例如，德语或者法语系统所用的月份简写与英语系统所用的不同\n",
    "\n",
    "# 特定于当前环境的日期格式\n",
    "# 代码    说明\n",
    "# %a      星期几的简写\n",
    "# %A      星期几的全称\n",
    "# %b      月份的简写\n",
    "# %B      月份的全称\n",
    "# %c      完整的日期和时间，例如：“ Tue 01 May 2012 04:20:57 PM”\n",
    "# %p      不同环境中的 AM 或者 PM\n",
    "# %x      适合于当前环境的日期格式，例如，在美国，“ May 1,2012” 会产生 “05/01/2012”\n",
    "# %X      适合于当前环境的时间格式，例如，“04:24:12 PM”\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-02    1.367430\n",
       "2011-01-05    0.822957\n",
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "2011-01-10   -0.931600\n",
       "2011-01-12    0.895005\n",
       "dtype: float64"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时间序列基础\n",
    "\n",
    "# pandas 最基础的时间序列类型就是以 时间戳 （通常以Python字符串或者datetime对象表示）为索引的 Series\n",
    "from datetime import datetime\n",
    "\n",
    "dates = [datetime(2011, 1, 2), datetime(2011, 1, 5),\n",
    "         datetime(2011, 1, 7), datetime(2011, 1, 8),\n",
    "         datetime(2011, 1, 10), datetime(2011, 1, 12)]\n",
    "\n",
    "ts = pd.Series(np.random.randn(6), index=dates)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2011-01-02', '2011-01-05', '2011-01-07', '2011-01-08',\n",
       "               '2011-01-10', '2011-01-12'],\n",
       "              dtype='datetime64[ns]', freq=None)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这些 datetime 对象实际上是被放在一个 DatetimeIndex 中的\n",
    "ts.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-02    2.734859\n",
       "2011-01-05         NaN\n",
       "2011-01-07   -0.068424\n",
       "2011-01-08         NaN\n",
       "2011-01-10   -1.863199\n",
       "2011-01-12         NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 跟其他 Series 一样，不同的索引的时间序列之间的算术运算会自动按日期对齐\n",
    "ts + ts[::2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('<M8[ns]')"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ts[::2] 是每隔两个取一个。\n",
    "# pandas 用 NumPy 的 datetime64 数据类型以纳秒形式存储时间戳\n",
    "ts.index.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-01-02 00:00:00')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# DatetimeIndex 中的各个标量值是 pandas 的 Timestamp 对象：\n",
    "stamp = ts.index[0]\n",
    "stamp\n",
    "\n",
    "# 只要有需要， TimeStamp 可以随时自动转换为 datetime 对象\n",
    "#  此外， 它还可以存储频率信息（如果有的话），且知道如何执行时区转换以及其他操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.03421201245126251"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 索引、选取、子集构造\n",
    "\n",
    "# 当根据标签索引选取数据时，时间序列和其他的 pandas.Series 很像\n",
    "stamp = ts.index[2]\n",
    "ts[stamp]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.9315997392643436"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 还有一种更为方便的用法：传入一个可以被解释为日期的字符串\n",
    "ts['1/10/2011']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.9315997392643436"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts['20110110']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01    0.342266\n",
       "2000-01-02   -1.621079\n",
       "2000-01-03    0.750330\n",
       "2000-01-04    0.502829\n",
       "2000-01-05    0.664263\n",
       "                ...   \n",
       "2002-09-22    0.471063\n",
       "2002-09-23   -0.717738\n",
       "2002-09-24   -0.433407\n",
       "2002-09-25   -0.010011\n",
       "2002-09-26    2.006758\n",
       "Freq: D, Length: 1000, dtype: float64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对于较长的时间序列，只需传入“年”或“年月”即可轻松选取数据的切片：\n",
    "longer_ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))\n",
    "longer_ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2001-01-01   -0.617494\n",
       "2001-01-02    1.229965\n",
       "2001-01-03   -0.022417\n",
       "2001-01-04   -1.025853\n",
       "2001-01-05    2.624126\n",
       "                ...   \n",
       "2001-12-27   -0.217695\n",
       "2001-12-28    1.116618\n",
       "2001-12-29    0.565025\n",
       "2001-12-30   -0.830889\n",
       "2001-12-31   -0.495236\n",
       "Freq: D, Length: 365, dtype: float64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "longer_ts['2001']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2001-05-01   -0.052618\n",
       "2001-05-02    0.200828\n",
       "2001-05-03   -2.389490\n",
       "2001-05-04   -0.829427\n",
       "2001-05-05   -1.273196\n",
       "2001-05-06    0.588170\n",
       "2001-05-07    0.036333\n",
       "2001-05-08    0.331617\n",
       "2001-05-09    0.453435\n",
       "2001-05-10   -0.704770\n",
       "2001-05-11   -0.636044\n",
       "2001-05-12   -0.947220\n",
       "2001-05-13    1.266133\n",
       "2001-05-14   -0.864094\n",
       "2001-05-15    0.565235\n",
       "2001-05-16   -0.058631\n",
       "2001-05-17    0.471075\n",
       "2001-05-18   -0.806075\n",
       "2001-05-19    0.311758\n",
       "2001-05-20    0.389037\n",
       "2001-05-21    0.566039\n",
       "2001-05-22    0.074817\n",
       "2001-05-23   -0.566135\n",
       "2001-05-24   -0.838178\n",
       "2001-05-25    0.545511\n",
       "2001-05-26    0.259913\n",
       "2001-05-27    0.673216\n",
       "2001-05-28    0.835277\n",
       "2001-05-29   -1.243058\n",
       "2001-05-30    0.114025\n",
       "2001-05-31    0.266334\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这里，字符串 “2001” 被解释成 年，并根据它选取时间区间，指定 月份 同样奏效\n",
    "longer_ts['2001-05']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "2011-01-10   -0.931600\n",
       "2011-01-12    0.895005\n",
       "dtype: float64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# datetime 对象也可以进行切片\n",
    "ts[datetime(2011, 1, 7):]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-02    1.367430\n",
       "2011-01-05    0.822957\n",
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "2011-01-10   -0.931600\n",
       "2011-01-12    0.895005\n",
       "dtype: float64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 由于大部分时间序列数据都是按照时间先后排序的\n",
    "# 因此可以用不存在于该时间序列中的时间戳对齐进行切片（即范围查询）\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "2011-01-10   -0.931600\n",
       "dtype: float64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts['1/6/2011':'1/11/2011']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-02    1.367430\n",
       "2011-01-05    0.822957\n",
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "dtype: float64"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 跟之前一样，可以传入字符串日期、datetime 或者 Timestamp\n",
    "# 注意，这样切片所产生的原时间序列的视图， 跟 numpy 数组的切片运算一样\n",
    "# 这意味着，没有数据被复制，对切片进行修改会反映到原始数据上\n",
    "# 此外，还有一个等价的实例方法也可以截取两个日期之间的 TimeSeries\n",
    "ts.truncate(after='1/9/2011')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2001-05-02</th>\n",
       "      <td>-0.247392</td>\n",
       "      <td>0.916190</td>\n",
       "      <td>0.223497</td>\n",
       "      <td>-2.253949</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001-05-09</th>\n",
       "      <td>-1.578685</td>\n",
       "      <td>2.325299</td>\n",
       "      <td>1.047231</td>\n",
       "      <td>0.050296</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001-05-16</th>\n",
       "      <td>-0.662699</td>\n",
       "      <td>-1.039453</td>\n",
       "      <td>2.561250</td>\n",
       "      <td>-0.915515</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001-05-23</th>\n",
       "      <td>-0.901332</td>\n",
       "      <td>-1.083829</td>\n",
       "      <td>0.374725</td>\n",
       "      <td>-0.675904</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001-05-30</th>\n",
       "      <td>-1.103621</td>\n",
       "      <td>0.584246</td>\n",
       "      <td>0.059045</td>\n",
       "      <td>-1.436393</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2001-05-02 -0.247392  0.916190  0.223497 -2.253949\n",
       "2001-05-09 -1.578685  2.325299  1.047231  0.050296\n",
       "2001-05-16 -0.662699 -1.039453  2.561250 -0.915515\n",
       "2001-05-23 -0.901332 -1.083829  0.374725 -0.675904\n",
       "2001-05-30 -1.103621  0.584246  0.059045 -1.436393"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这些操作对 DataFrame 也有效\n",
    "# 例如，对 DataFrame 的行进行索引\n",
    "dates = pd.date_range('1/1/2000', periods=100, freq='W-WED')\n",
    "\n",
    "long_df = pd.DataFrame(np.random.randn(100, 4),\n",
    "                       index=dates,\n",
    "                       columns=['Colorado', 'Texas', 'New York', 'Ohio'])\n",
    "\n",
    "long_df.loc['5-2001']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01    0\n",
       "2000-01-02    1\n",
       "2000-01-02    2\n",
       "2000-01-02    3\n",
       "2000-01-03    4\n",
       "dtype: int32"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 带有重复索引的时间序列\n",
    "\n",
    "# 在某些应用场景中，可能会存在多个观测数据落在同一个时间点上的情况\n",
    "dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000', '1/2/2000', '1/3/2000'])\n",
    "\n",
    "dup_ts = pd.Series(np.arange(5), index=dates)\n",
    "dup_ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过检查索引的 is_unique 属性，就可以知道它是不是唯一的\n",
    "dup_ts.index.is_unique"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对于这个时间序列进行索引，要么产生表两只，要么产生切片\n",
    "#    具体要看所选的时间点是否重复\n",
    "dup_ts['1/3/2000'] # not duplicated 不重复"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-02    1\n",
       "2000-01-02    2\n",
       "2000-01-02    3\n",
       "dtype: int32"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dup_ts['1/2/2000'] # duplicated 重复"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01    0\n",
       "2000-01-02    2\n",
       "2000-01-03    4\n",
       "dtype: int32"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 假设想要对具有非唯一时间戳的数据进行聚合\n",
    "# 其中一个方法就是使用 groupby 并传入 level=0\n",
    "grouped = dup_ts.groupby(level=0)\n",
    "grouped.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01    1\n",
       "2000-01-02    3\n",
       "2000-01-03    1\n",
       "dtype: int64"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011-01-02    1.367430\n",
       "2011-01-05    0.822957\n",
       "2011-01-07   -0.034212\n",
       "2011-01-08    0.559514\n",
       "2011-01-10   -0.931600\n",
       "2011-01-12    0.895005\n",
       "dtype: float64"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 日期的范围、频率以及移动\n",
    "\n",
    "# pandas 中的原生时间序列一般被认为是不规则的，也就是说，它们没有固定的频率\n",
    "# 对于大部分应用程序而言，这是无所谓的。 \n",
    "# 但是，它常常需要以某种相对固定的频率进行分析，比如每日、每月、每15分钟等（这样自然会在时间序列中引入缺失值）\n",
    "\n",
    "# 幸运的是， pandas 有一整套标准时间序列频率以及用于重采样、频率推断、生成固定频率日期范围的工具。\n",
    "\n",
    "# 例如，可以将之前那个时间序列转换为一个具有固定频率（每日）的时间序列，只需调用 resample 即可\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.resample.DatetimeIndexResampler object at 0x00000000080D22C8>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 频率的转换（或者 重采样）是一个大的主题，使用基本的频率和其倍数\n",
    "# 'D' 这个字符串就是每天的意思\n",
    "resampler = ts.resample('D')\n",
    "\n",
    "resampler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',\n",
       "               '2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',\n",
       "               '2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',\n",
       "               '2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',\n",
       "               '2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20',\n",
       "               '2012-04-21', '2012-04-22', '2012-04-23', '2012-04-24',\n",
       "               '2012-04-25', '2012-04-26', '2012-04-27', '2012-04-28',\n",
       "               '2012-04-29', '2012-04-30', '2012-05-01', '2012-05-02',\n",
       "               '2012-05-03', '2012-05-04', '2012-05-05', '2012-05-06',\n",
       "               '2012-05-07', '2012-05-08', '2012-05-09', '2012-05-10',\n",
       "               '2012-05-11', '2012-05-12', '2012-05-13', '2012-05-14',\n",
       "               '2012-05-15', '2012-05-16', '2012-05-17', '2012-05-18',\n",
       "               '2012-05-19', '2012-05-20', '2012-05-21', '2012-05-22',\n",
       "               '2012-05-23', '2012-05-24', '2012-05-25', '2012-05-26',\n",
       "               '2012-05-27', '2012-05-28', '2012-05-29', '2012-05-30',\n",
       "               '2012-05-31', '2012-06-01'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 生成日期范围\n",
    "\n",
    "# pandas.date_range 可用于根据指定的频率生成指定长度的 DatetimeIndex：\n",
    "index = pd.date_range('2012-04-01', '2012-06-01')\n",
    "index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',\n",
       "               '2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',\n",
       "               '2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',\n",
       "               '2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',\n",
       "               '2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 默认情况下， date_range 会产生按天计算的时间点\n",
    "#  如果只传入起始或结束日期， 那就还得传入一个表示一段时间的数字：\n",
    "pd.date_range(start='2012-04-01', periods=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-05-13', '2012-05-14', '2012-05-15', '2012-05-16',\n",
       "               '2012-05-17', '2012-05-18', '2012-05-19', '2012-05-20',\n",
       "               '2012-05-21', '2012-05-22', '2012-05-23', '2012-05-24',\n",
       "               '2012-05-25', '2012-05-26', '2012-05-27', '2012-05-28',\n",
       "               '2012-05-29', '2012-05-30', '2012-05-31', '2012-06-01'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.date_range(end='2012-06-01', periods=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31', '2000-04-28',\n",
       "               '2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31',\n",
       "               '2000-09-29', '2000-10-31', '2000-11-30'],\n",
       "              dtype='datetime64[ns]', freq='BM')"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 起始和结束日期定义了日期索引的严格边界。\n",
    "#   例如，想要生成一个由每月最后一个工作日组成的日期索引，\n",
    "#       可以传入 \"BM\"频率（表示business end of month，）\n",
    "#       这样就只会包含时间间隔内（或刚好在边界上的） 符合频率要求的日期\n",
    "pd.date_range('2000-01-01', '2000-12-01', freq='BM')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# date_range 默认会保留起始和结束时间戳的时间信息（如果有的话）\n",
    "![self](./../image/date_range1.png)\n",
    "![self](./../image/date_range2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-05-02 12:56:31', '2012-05-03 12:56:31',\n",
       "               '2012-05-04 12:56:31', '2012-05-05 12:56:31',\n",
       "               '2012-05-06 12:56:31'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.date_range('2012-05-02 12:56:31', periods=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-05-02', '2012-05-03', '2012-05-04', '2012-05-05',\n",
       "               '2012-05-06'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有时，虽然起始和结束日期带有时间信息，\n",
    "# 但希望产生一组被规范化（normalize）到午夜的时间戳\n",
    "#  normalize 选项即可实现该功能：\n",
    "pd.date_range('2012-05-02 12:56:31', periods=5, normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Hour>"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 频率和日期偏移量\n",
    "\n",
    "# pandas 中的频率是有一个基础频率（base frequency）和一个乘数组成的\n",
    "# 基础频率通常以一个字符串别名表示，比如 \"M\" 表示每月， \"H\" 表示每小时\n",
    "#  对于每个基础频率，都有一个被称为日期偏移量（date offset） 的对象与之对应。 \n",
    "# 例如， 按小时计算的频率可以用 Hour 类 表示：\n",
    "\n",
    "from pandas.tseries.offsets import Hour, Minute\n",
    "\n",
    "hour = Hour()\n",
    "\n",
    "hour"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<4 * Hours>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 传入一个完整即可定义偏移量的倍数\n",
    "four_hours = Hour(4)\n",
    "\n",
    "four_hours"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 04:00:00',\n",
       "               '2000-01-01 08:00:00', '2000-01-01 12:00:00',\n",
       "               '2000-01-01 16:00:00', '2000-01-01 20:00:00',\n",
       "               '2000-01-02 00:00:00', '2000-01-02 04:00:00',\n",
       "               '2000-01-02 08:00:00', '2000-01-02 12:00:00',\n",
       "               '2000-01-02 16:00:00', '2000-01-02 20:00:00',\n",
       "               '2000-01-03 00:00:00', '2000-01-03 04:00:00',\n",
       "               '2000-01-03 08:00:00', '2000-01-03 12:00:00',\n",
       "               '2000-01-03 16:00:00', '2000-01-03 20:00:00'],\n",
       "              dtype='datetime64[ns]', freq='4H')"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 一般来说，无需明确创建这样的对象，只需使用诸如 \"H\" 或 \"4H\" 这样的字符串别名即可。\n",
    "#  在基础频率前面放上一个整数即可创建倍数：\n",
    "pd.date_range('2000-01-01', '2000-01-03 23:59', freq='4h')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<150 * Minutes>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 大部分偏移量对象都可以通过加法进行连接\n",
    "Hour(2) + Minute(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:30:00',\n",
       "               '2000-01-01 03:00:00', '2000-01-01 04:30:00',\n",
       "               '2000-01-01 06:00:00', '2000-01-01 07:30:00',\n",
       "               '2000-01-01 09:00:00', '2000-01-01 10:30:00',\n",
       "               '2000-01-01 12:00:00', '2000-01-01 13:30:00'],\n",
       "              dtype='datetime64[ns]', freq='90T')"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 同理，也可以传入频率字符串——如 \" 2h30min \"\n",
    "# 这种字符串可以被高效地解析为等效的表达式\n",
    "pd.date_range('2000-01-01', periods=10, freq='1h30min')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 有些频率所描述的时间点并不是均匀分隔的\n",
    "#  例如， \"M\"（日历月末） 和 \"BM\"（每月最后一个工作# 日）就取决于每月的天数， \n",
    "#      对于后者， 还要考虑月末是不是周末。 \n",
    "\n",
    "#   由于没有更好的术语，将这些称为 锚点偏移量（anchored offset） \n",
    "\n",
    "# 表 11-4 列出了 pandas 中的频率代码和日期偏移量类\n",
    "\n",
    "# 笔记： 用户可以根据实际需求自定义一些频率类以便提供 pandas 所没有的日期逻辑， 但具体的细节查看文档说明"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Timestamp('2012-01-20 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-02-17 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-03-16 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-04-20 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-05-18 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-06-15 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-07-20 00:00:00', freq='WOM-3FRI'),\n",
       " Timestamp('2012-08-17 00:00:00', freq='WOM-3FRI')]"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# WOM 日期\n",
    "\n",
    "# WOM（Week Of Month）是一种非常实用的频率类，\n",
    "#  它以 WOM 开头， 能获得诸如 “每月第3个星期五”之类的日期：\n",
    "rng = pd.date_range('2012-01-01', '2012-09-01', freq='WOM-3FRI')\n",
    "list(rng)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31   -0.761337\n",
       "2000-02-29    0.417541\n",
       "2000-03-31    1.232087\n",
       "2000-04-30    1.513775\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 移动（超前和滞后） 数据\n",
    "\n",
    "# 移动（shifting） 指的是沿着时间轴将数据前移或后移。\n",
    "# Series 和 DataFrame 都有一个 shift 方法用于执行单纯的前移或后移操作，保持索引不变：\n",
    "ts = pd.Series(np.random.randn(4),\n",
    "               index=pd.date_range('1/1/2000', periods=4, freq='M'))\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31         NaN\n",
       "2000-02-29         NaN\n",
       "2000-03-31   -0.761337\n",
       "2000-04-30    0.417541\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.shift(2)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31    1.232087\n",
       "2000-02-29    1.513775\n",
       "2000-03-31         NaN\n",
       "2000-04-30         NaN\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.shift(-2)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-03-31   -0.761337\n",
       "2000-04-30    0.417541\n",
       "2000-05-31    1.232087\n",
       "2000-06-30    1.513775\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当这样进行移动时， 就会在时间序列的前面或后面产生缺失数据。\n",
    "# shift 通常用于计算一个时间序列或多个时间序列（如 DataFrame 的列）中的百分比变化。可以这样表达：\n",
    "# ts / ts.shift(1) - 1\n",
    "\n",
    "# 由于单纯的移位操作不会修改索引， 所以部分数据会被丢弃。\n",
    "# 因此， 如果频率已知， 则可以将其传给 shift 以便实现对时间戳进行位移而不是对数据进行简单位移：\n",
    "ts.shift(2, freq='M')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-02-03   -0.761337\n",
       "2000-03-03    0.417541\n",
       "2000-04-03    1.232087\n",
       "2000-05-03    1.513775\n",
       "dtype: float64"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这里还可以使用其他频率， 于是你就能非常灵活地对数据进行超前和滞后处理了：\n",
    "ts.shift(3, freq='D')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31 01:30:00   -0.761337\n",
       "2000-02-29 01:30:00    0.417541\n",
       "2000-03-31 01:30:00    1.232087\n",
       "2000-04-30 01:30:00    1.513775\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.shift(1, freq='90T')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-11-20 00:00:00')"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过偏移量对日期进行位移\n",
    "\n",
    "# pandas 的日期偏移量还可以用在 datetime 或 Timestamp 对象上：\n",
    "from pandas.tseries.offsets import Day, MonthEnd\n",
    "now = datetime(2011, 11, 17)\n",
    "now + 3 * Day()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-11-30 00:00:00')"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果加的是锚点偏移量（比如 MonthEnd ） ，第一次增量会将原日期向前滚动到符合频率规则的下一个日期：\n",
    "now + MonthEnd()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-12-31 00:00:00')"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "now + MonthEnd(2)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-11-30 00:00:00')"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过锚点偏移量的rollforward和rollback方法， 可明确地将日期向前或向后“滚动”：\n",
    "offset = MonthEnd()\n",
    "offset.rollforward(now)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-10-31 00:00:00')"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "offset.rollback(now)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-15    0.620550\n",
       "2000-01-19    2.747979\n",
       "2000-01-23   -1.405383\n",
       "2000-01-27   -0.635791\n",
       "2000-01-31    1.281045\n",
       "2000-02-04   -1.762003\n",
       "2000-02-08   -0.057273\n",
       "2000-02-12    0.055733\n",
       "2000-02-16   -2.395108\n",
       "2000-02-20    0.649025\n",
       "2000-02-24   -0.656187\n",
       "2000-02-28   -0.951555\n",
       "2000-03-03    0.386117\n",
       "2000-03-07    0.974389\n",
       "2000-03-11    0.283152\n",
       "2000-03-15    1.422702\n",
       "2000-03-19   -0.450844\n",
       "2000-03-23    1.742968\n",
       "2000-03-27    0.338283\n",
       "2000-03-31   -0.079565\n",
       "Freq: 4D, dtype: float64"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 日期偏移量还有一个巧妙的用法， 即结合 groupby 使用这两个“滚动”方法：\n",
    "ts = pd.Series(np.random.randn(20),\n",
    "               index=pd.date_range('1/15/2000', periods=20, freq='4d'))\n",
    "ts\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31    0.521680\n",
       "2000-02-29   -0.731053\n",
       "2000-03-31    0.577150\n",
       "dtype: float64"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.groupby(offset.rollforward).mean()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31    0.521680\n",
       "2000-02-29   -0.731053\n",
       "2000-03-31    0.577150\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当然，更简单、更快速地实现该功能的办法是使用 resample\n",
    "ts.resample('M').mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['US/Eastern', 'US/Hawaii', 'US/Mountain', 'US/Pacific', 'UTC']"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时区处理\n",
    "\n",
    "# 时间序列处理工作中最让人不爽的就是对时区的处理。\n",
    "# 许多人都选择以协调世界时（UTC，它是格林尼治标准时间（Greenwich Mean Time）的接替者，目前已经是国际标准了）来处理时间序列\n",
    "#  时区是以 UTC 偏移量 的形式表示的\n",
    "\n",
    "# 例如， 夏令时期间， 纽约比 UTC 慢 4 小时， 而在全年其他时间则比 UTC 慢 5 小时\n",
    "\n",
    "# 在 Python 中， 时区信息来自第三方库 pytz，它使 Python 可以使用 Olson 数据库（汇编了世界时区信息）\n",
    "#  这对历史数据非常重要，这是因为由于各地政府的各种突发奇想，夏令时转变日期（甚至 UTC 偏移量）已经发生过多次改变了\n",
    "#   就拿美国来说， DST 转变时间自 1900年以来就改变过多次\n",
    "\n",
    "# 有关 pytz 库的更多信息， 请查阅其文档\n",
    "#    就由于 pandas 包装了 pytz 的功能， 因此可以不用记忆其 API， 只要记得时区的名称即可\n",
    "# 时区名 可以在 shell 中看到， 也可以通过文档查看：\n",
    "import pytz\n",
    "pytz.common_timezones[-5:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 要从 pytz 中获取时区对象，使用 pytz.timezone 即可\n",
    "tz = pytz.timezone('America/New_York')\n",
    "tz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pandas 中的方法既可以接受时区名也可以接受这些对象\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-09 09:30:00   -0.309431\n",
       "2012-03-10 09:30:00    0.929352\n",
       "2012-03-11 09:30:00    0.154054\n",
       "2012-03-12 09:30:00    0.958317\n",
       "2012-03-13 09:30:00    1.302385\n",
       "2012-03-14 09:30:00    0.703194\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时区本地化和转换\n",
    "\n",
    "# 默认情况下，pandas 中的时间序列时单纯（naive）的时区\n",
    "rng = pd.date_range('3/9/2012 9:30', periods=6, freq='D')\n",
    "\n",
    "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n"
     ]
    }
   ],
   "source": [
    "# the index is None\n",
    "# 其索引的 tz 字段为 None\n",
    "print(ts.index.tz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-03-09 09:30:00+00:00', '2012-03-10 09:30:00+00:00',\n",
       "               '2012-03-11 09:30:00+00:00', '2012-03-12 09:30:00+00:00',\n",
       "               '2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00',\n",
       "               '2012-03-15 09:30:00+00:00', '2012-03-16 09:30:00+00:00',\n",
       "               '2012-03-17 09:30:00+00:00', '2012-03-18 09:30:00+00:00'],\n",
       "              dtype='datetime64[ns, UTC]', freq='D')"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以用时区集生成日期范围\n",
    "pd.date_range('3/9/2012 9:30', periods=10, freq='D', tz='UTC')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-09 09:30:00   -0.309431\n",
       "2012-03-10 09:30:00    0.929352\n",
       "2012-03-11 09:30:00    0.154054\n",
       "2012-03-12 09:30:00    0.958317\n",
       "2012-03-13 09:30:00    1.302385\n",
       "2012-03-14 09:30:00    0.703194\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从单纯到本地化的转换是通过tz_localize方法处理的\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-09 09:30:00+00:00   -0.309431\n",
       "2012-03-10 09:30:00+00:00    0.929352\n",
       "2012-03-11 09:30:00+00:00    0.154054\n",
       "2012-03-12 09:30:00+00:00    0.958317\n",
       "2012-03-13 09:30:00+00:00    1.302385\n",
       "2012-03-14 09:30:00+00:00    0.703194\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_utc = ts.tz_localize('UCT')\n",
    "ts_utc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-03-09 09:30:00+00:00', '2012-03-10 09:30:00+00:00',\n",
       "               '2012-03-11 09:30:00+00:00', '2012-03-12 09:30:00+00:00',\n",
       "               '2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00'],\n",
       "              dtype='datetime64[ns, UCT]', freq='D')"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_utc.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-09 04:30:00-05:00   -0.309431\n",
       "2012-03-10 04:30:00-05:00    0.929352\n",
       "2012-03-11 05:30:00-04:00    0.154054\n",
       "2012-03-12 05:30:00-04:00    0.958317\n",
       "2012-03-13 05:30:00-04:00    1.302385\n",
       "2012-03-14 05:30:00-04:00    0.703194\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 一旦时间序列被本地化到某个特定时区， 就可以用tz_convert将其转换到别的时区了\n",
    "ts_utc.tz_convert('America/New_York')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-09 14:30:00+00:00   -0.309431\n",
       "2012-03-10 14:30:00+00:00    0.929352\n",
       "2012-03-11 13:30:00+00:00    0.154054\n",
       "2012-03-12 13:30:00+00:00    0.958317\n",
       "2012-03-13 13:30:00+00:00    1.302385\n",
       "2012-03-14 13:30:00+00:00    0.703194\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对于上面这种时间序列（它跨越了美国东部时区的夏令时转变期）\n",
    "#   可以将其本地化到 EST，然后转换为 UTC 或 柏林时间：\n",
    "ts_eastern = ts.tz_localize('America/New_York')\n",
    "\n",
    "ts_eastern.tz_convert('UTC')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-03-09 09:30:00+08:00', '2012-03-10 09:30:00+08:00',\n",
       "               '2012-03-11 09:30:00+08:00', '2012-03-12 09:30:00+08:00',\n",
       "               '2012-03-13 09:30:00+08:00', '2012-03-14 09:30:00+08:00'],\n",
       "              dtype='datetime64[ns, Asia/Shanghai]', freq='D')"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# tz_localize 和 tz_convert 也是 DatetimeIndex 的实例方法：\n",
    "ts.index.tz_localize('Asia/Shanghai')\n",
    "# 注意： 对单纯时间戳的本地化操作还会检查夏令时转变期附近容易混淆或不存在的时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-03-11 23:00:00-0500', tz='America/New_York')"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 操作时区意识型 Timestamp 对象\n",
    "\n",
    "# 跟时间序列和日期范围差不多， 独立的 Timestamp 对象也能被从单纯型（naive）本地化为时区意识型（time zone-aware），\n",
    "#  并从一个时区转换到另一个时区：\n",
    "stamp = pd.Timestamp('2011-03-12 04:00')\n",
    "\n",
    "stamp_utc = stamp.tz_localize('utc')\n",
    "\n",
    "stamp_utc.tz_convert('America/New_York')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2011-03-12 04:00:00+0300', tz='Europe/Moscow')"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在创建Timestamp时， 还可以传入一个时区信息：\n",
    "stamp_moscow = pd.Timestamp('2011-03-12 04:00', tz='Europe/Moscow')\n",
    "stamp_moscow\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1299902400000000000"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时区意识型 Timestamp 对象在内部保存了一个 UTC 时间戳值（自UNIX纪元（1970年1月1日） 算起的纳秒数）\n",
    "#  这个 UTC 值在时区转换过程中是不会发生变化的：\n",
    "stamp_utc.value\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1299902400000000000"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stamp_utc.tz_convert('America/New_York').value\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2012-03-12 01:30:00-0400', tz='US/Eastern')"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当使用 pandas 的 DateOffset 对象执行时间算术运算时， 运算过程会自动关注是否存在夏令时转变期。 \n",
    "# 这里，创建了在 DST 转变之前的时间戳。 首先， 来看夏令时转变前的30分钟：\n",
    "from pandas.tseries.offsets import Hour\n",
    "stamp = pd.Timestamp('2012-03-12 01:30', tz='US/Eastern')\n",
    "stamp\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2012-03-12 02:30:00-0400', tz='US/Eastern')"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stamp + Hour()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2012-11-04 00:30:00-0400', tz='US/Eastern')"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 然后， 夏令时转变前90分钟：\n",
    "stamp = pd.Timestamp('2012-11-04 00:30', tz='US/Eastern')\n",
    "stamp\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2012-11-04 01:30:00-0500', tz='US/Eastern')"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stamp + 2 * Hour()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-07 09:30:00   -0.126167\n",
       "2012-03-08 09:30:00    0.234956\n",
       "2012-03-09 09:30:00   -0.049645\n",
       "2012-03-12 09:30:00    0.242717\n",
       "2012-03-13 09:30:00   -1.514544\n",
       "2012-03-14 09:30:00   -1.579256\n",
       "2012-03-15 09:30:00   -0.727695\n",
       "2012-03-16 09:30:00    0.621664\n",
       "2012-03-19 09:30:00    0.041619\n",
       "2012-03-20 09:30:00   -0.111274\n",
       "Freq: B, dtype: float64"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 不同时区之间的运算\n",
    "\n",
    "# 如果两个时间序列的时区不同， 在将它们合并到一起时， 最终结果就会是 UTC\n",
    "#   由于时间戳其实是以 UTC 存储的， 所以这是一个很简单的运算， 并不需要发生任何转换：\n",
    "rng = pd.date_range('3/7/2012 9:30', periods=10, freq='B')\n",
    "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n",
    "ts\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2012-03-07 09:30:00+00:00', '2012-03-08 09:30:00+00:00',\n",
       "               '2012-03-09 09:30:00+00:00', '2012-03-12 09:30:00+00:00',\n",
       "               '2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00',\n",
       "               '2012-03-15 09:30:00+00:00'],\n",
       "              dtype='datetime64[ns, UTC]', freq='B')"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts1 = ts[:7].tz_localize('Europe/London')\n",
    "\n",
    "ts2 = ts1[2:].tz_convert('Europe/Moscow')\n",
    "\n",
    "result = ts1 + ts2\n",
    "result.index\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007', 'A-DEC')"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时期及其算术运算\n",
    "\n",
    "# 时期（period） 表示的是时间区间， 比如数日、 数月、 数季、 数年等。\n",
    "# Period 类所表示的就是这种数据类型， 其构造函数需要用到一个字符串或整数， 以及表11-4中的频率：\n",
    "p = pd.Period(2007, freq='A-DEC')\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2012', 'A-DEC')"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这里，这个 Period 对象表示的是从 2007年1月1日到2007年12月31日之间的整段时间\n",
    "#     只需要对 Period 对象加上或者减去一个整数即可达到根据其频率进行位移的效果\n",
    "p + 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2002', 'A-DEC')"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p - 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<7 * YearEnds: month=12>"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果两个 Period 对象拥有相同的频率，则它们的差就是它们之间的单位数量\n",
    "pd.Period('2014', freq='A-DEC') - p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PeriodIndex(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05', '2000-06'], dtype='period[M]', freq='M')"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# period_range 函数可用于创建规则的时期范围\n",
    "rng = pd.period_range('2000-01-01', '2000-06-30', freq='M')\n",
    "rng"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01    1.117801\n",
       "2000-02   -0.124107\n",
       "2000-03    0.923309\n",
       "2000-04   -0.146041\n",
       "2000-05    0.729804\n",
       "2000-06    1.383114\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# PeriodIndex 类保存了一组 Period， 它可以在任何 pandas 数据结构中被用作轴索引：\n",
    "pd.Series(np.random.randn(6), index=rng)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PeriodIndex(['2001Q3', '2002Q2', '2003Q1'], dtype='period[Q-DEC]', freq='Q-DEC')"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果你有一个字符串数组， 你也可以使用 PeriodIndex 类\n",
    "values = ['2001Q3', '2002Q2', '2003Q1']\n",
    "index = pd.PeriodIndex(values, freq='Q-DEC')\n",
    "index\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007', 'A-DEC')"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 时期的频率转换\n",
    "\n",
    "# Period 和 PeriodIndex 对象都可以通过其 asfreq 方法被转换成别的频率。\n",
    "# 假设有一个年度时期，希望将其转换为当年年初或年末的一个月度时期\n",
    "p = pd.Period('2007', freq='A-DEC')\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007-01', 'M')"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.asfreq('M', how='start')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007-12', 'M')"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.asfreq('M', how='end')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007', 'A-JUN')"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以将 Period('2007','A-DEC') 看做一个被划分为多个月度时期的时间段中的游标\n",
    "# 对于一个不以 12月结束的财政年度， 月度子时期的归属情况就不一样了：\n",
    "p = pd.Period('2007', freq='A-JUN')\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2006-07', 'M')"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.asfreq('M', 'start')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2007-06', 'M')"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.asfreq('M', 'end')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![self](./../image/period.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2008', 'A-JUN')"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p = pd.Period('Aug-2007', 'M')\n",
    "\n",
    "p.asfreq('A-JUN')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2006    2.657626\n",
       "2007    0.838450\n",
       "2008    0.195444\n",
       "2009   -0.145471\n",
       "Freq: A-DEC, dtype: float64"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 完整的 PeriodIndex 或 TimeSeries 的频率转换方式也是如此：\n",
    "rng = pd.period_range('2006', '2009', freq='A-DEC')\n",
    "\n",
    "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2006-01    2.657626\n",
       "2007-01    0.838450\n",
       "2008-01    0.195444\n",
       "2009-01   -0.145471\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.asfreq('M', how='start')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2006-12-29    2.657626\n",
       "2007-12-31    0.838450\n",
       "2008-12-31    0.195444\n",
       "2009-12-31   -0.145471\n",
       "Freq: B, dtype: float64"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这里，根据年度时期的第一个月，每年的时期被取代为每月的时期\n",
    "#    如果想要每年的最后一个工作日，可以使用 “B” 频率，并指明想要该时期的末尾：\n",
    "ts.asfreq('B', how='end')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2012Q4', 'Q-JAN')"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按季度计算的时期频率\n",
    "\n",
    "#  季度型数据在会计、金融等领域中很常见\n",
    "#  许多季度型数据都会涉及“财年末”的概念， 通常是一年 12个月中某月的最后一个日历日或工作日\n",
    "#    就这一点来说， 时期 \"2012Q4\" 根据财年末的不同会有不同的含义。 pandas 支持12种可能的季度型频率，即 Q-JAN 到 Q-DEC：\n",
    "p = pd.Period('2012Q4', freq='Q-JAN')\n",
    "p\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2011-11-01', 'D')"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在以1月结束的财年中， 2012Q4 是从 11 月到 1 月（将其转换为日型频率就明白了）\n",
    "p.asfreq('D', 'start')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2012-01-31', 'D')"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p.asfreq('D', 'end')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![self](./../image/year.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Period('2012-01-30 16:00', 'T')"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p4pm = (p.asfreq('B', 'e') - 1).asfreq('T', 's') + 16 * 60\n",
    "\n",
    "p4pm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2012-01-30 16:00:00')"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p4pm.to_timestamp()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2011Q3    0\n",
       "2011Q4    1\n",
       "2012Q1    2\n",
       "2012Q2    3\n",
       "2012Q3    4\n",
       "2012Q4    5\n",
       "Freq: Q-JAN, dtype: int32"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# period_range 可用于生成季度型范围, 季度型范围的算术运算也跟上面是一样的：\n",
    "rng = pd.period_range('2011Q3', '2012Q4', freq='Q-JAN')\n",
    "\n",
    "ts = pd.Series(np.arange(len(rng)), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2010-10-28 16:00:00    0\n",
       "2011-01-28 16:00:00    1\n",
       "2011-04-28 16:00:00    2\n",
       "2011-07-28 16:00:00    3\n",
       "2011-10-28 16:00:00    4\n",
       "2012-01-30 16:00:00    5\n",
       "dtype: int32"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_rng = (rng.asfreq('B', 'e') - 1).asfreq('T', 's') + 16 * 60\n",
    "\n",
    "ts.index = new_rng.to_timestamp()\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31    0.235126\n",
       "2000-02-29    0.375694\n",
       "2000-03-31    1.534345\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将 Timestamp 转换为 Period（及其反向过程）\n",
    "# 通过使用 to_period 方法，可以将由时间戳索引的 Series 和 DataFrame 对象转换为以时期索引：\n",
    "rng = pd.date_range('2000-01-01', periods=3, freq='M')\n",
    "\n",
    "ts = pd.Series(np.random.randn(3), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01    0.235126\n",
       "2000-02    0.375694\n",
       "2000-03    1.534345\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pts = ts.to_period()\n",
    "\n",
    "pts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-29    1.356512\n",
       "2000-01-30   -0.225439\n",
       "2000-01-31   -0.295022\n",
       "2000-02-01    0.577010\n",
       "2000-02-02   -0.727756\n",
       "2000-02-03   -1.583364\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 由于时期指的是非重叠时间区间， 因此对于给定的频率， 一个时间戳只能属于一个时期\n",
    "#  新  PeriodIndex 的频率默认是从时间戳推断而来的， 也可以指定任何别的频率\n",
    "# 结果中允许存在重复时期：\n",
    "rng = pd.date_range('1/29/2000', periods=6, freq='D')\n",
    "\n",
    "ts2 = pd.Series(np.random.randn(6), index=rng)\n",
    "\n",
    "ts2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01    1.356512\n",
       "2000-01   -0.225439\n",
       "2000-01   -0.295022\n",
       "2000-02    0.577010\n",
       "2000-02   -0.727756\n",
       "2000-02   -1.583364\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts2.to_period('M')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-29    1.356512\n",
       "2000-01-30   -0.225439\n",
       "2000-01-31   -0.295022\n",
       "2000-02-01    0.577010\n",
       "2000-02-02   -0.727756\n",
       "2000-02-03   -1.583364\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 要转换回时间戳， 使用 to_timestamp 即可：\n",
    "pts = ts2.to_period()\n",
    "\n",
    "pts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-29 23:59:59.999999999    1.356512\n",
       "2000-01-30 23:59:59.999999999   -0.225439\n",
       "2000-01-31 23:59:59.999999999   -0.295022\n",
       "2000-02-01 23:59:59.999999999    0.577010\n",
       "2000-02-02 23:59:59.999999999   -0.727756\n",
       "2000-02-03 23:59:59.999999999   -1.583364\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pts.to_timestamp(how='end')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>quarter</th>\n",
       "      <th>realgdp</th>\n",
       "      <th>realcons</th>\n",
       "      <th>realinv</th>\n",
       "      <th>realgovt</th>\n",
       "      <th>realdpi</th>\n",
       "      <th>cpi</th>\n",
       "      <th>m1</th>\n",
       "      <th>tbilrate</th>\n",
       "      <th>unemp</th>\n",
       "      <th>pop</th>\n",
       "      <th>infl</th>\n",
       "      <th>realint</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1959.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2710.349</td>\n",
       "      <td>1707.4</td>\n",
       "      <td>286.898</td>\n",
       "      <td>470.045</td>\n",
       "      <td>1886.9</td>\n",
       "      <td>28.98</td>\n",
       "      <td>139.7</td>\n",
       "      <td>2.82</td>\n",
       "      <td>5.8</td>\n",
       "      <td>177.146</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1959.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2778.801</td>\n",
       "      <td>1733.7</td>\n",
       "      <td>310.859</td>\n",
       "      <td>481.301</td>\n",
       "      <td>1919.7</td>\n",
       "      <td>29.15</td>\n",
       "      <td>141.7</td>\n",
       "      <td>3.08</td>\n",
       "      <td>5.1</td>\n",
       "      <td>177.830</td>\n",
       "      <td>2.34</td>\n",
       "      <td>0.74</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1959.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2775.488</td>\n",
       "      <td>1751.8</td>\n",
       "      <td>289.226</td>\n",
       "      <td>491.260</td>\n",
       "      <td>1916.4</td>\n",
       "      <td>29.35</td>\n",
       "      <td>140.5</td>\n",
       "      <td>3.82</td>\n",
       "      <td>5.3</td>\n",
       "      <td>178.657</td>\n",
       "      <td>2.74</td>\n",
       "      <td>1.09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1959.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2785.204</td>\n",
       "      <td>1753.7</td>\n",
       "      <td>299.356</td>\n",
       "      <td>484.052</td>\n",
       "      <td>1931.3</td>\n",
       "      <td>29.37</td>\n",
       "      <td>140.0</td>\n",
       "      <td>4.33</td>\n",
       "      <td>5.6</td>\n",
       "      <td>179.386</td>\n",
       "      <td>0.27</td>\n",
       "      <td>4.06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1960.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2847.699</td>\n",
       "      <td>1770.5</td>\n",
       "      <td>331.722</td>\n",
       "      <td>462.199</td>\n",
       "      <td>1955.5</td>\n",
       "      <td>29.54</td>\n",
       "      <td>139.6</td>\n",
       "      <td>3.50</td>\n",
       "      <td>5.2</td>\n",
       "      <td>180.007</td>\n",
       "      <td>2.31</td>\n",
       "      <td>1.19</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     year  quarter   realgdp  realcons  realinv  realgovt  realdpi    cpi  \\\n",
       "0  1959.0      1.0  2710.349    1707.4  286.898   470.045   1886.9  28.98   \n",
       "1  1959.0      2.0  2778.801    1733.7  310.859   481.301   1919.7  29.15   \n",
       "2  1959.0      3.0  2775.488    1751.8  289.226   491.260   1916.4  29.35   \n",
       "3  1959.0      4.0  2785.204    1753.7  299.356   484.052   1931.3  29.37   \n",
       "4  1960.0      1.0  2847.699    1770.5  331.722   462.199   1955.5  29.54   \n",
       "\n",
       "      m1  tbilrate  unemp      pop  infl  realint  \n",
       "0  139.7      2.82    5.8  177.146  0.00     0.00  \n",
       "1  141.7      3.08    5.1  177.830  2.34     0.74  \n",
       "2  140.5      3.82    5.3  178.657  2.74     1.09  \n",
       "3  140.0      4.33    5.6  179.386  0.27     4.06  \n",
       "4  139.6      3.50    5.2  180.007  2.31     1.19  "
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过数组创建 PeriodIndex\n",
    "\n",
    "# 固定频率的数据集通常会将时间信息分开存放在多个列中\n",
    "#    在下面这个宏观经济数据集中，年度和季度就分别存放在不同的列中：\n",
    "\n",
    "# the path of dataset\n",
    "dataset_path = './../dataset/'\n",
    "\n",
    "data = pd.read_csv(dataset_path + 'macrodata.csv')\n",
    "\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      1959.0\n",
       "1      1959.0\n",
       "2      1959.0\n",
       "3      1959.0\n",
       "4      1960.0\n",
       "        ...  \n",
       "198    2008.0\n",
       "199    2008.0\n",
       "200    2009.0\n",
       "201    2009.0\n",
       "202    2009.0\n",
       "Name: year, Length: 203, dtype: float64"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.year"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      1.0\n",
       "1      2.0\n",
       "2      3.0\n",
       "3      4.0\n",
       "4      1.0\n",
       "      ... \n",
       "198    3.0\n",
       "199    4.0\n",
       "200    1.0\n",
       "201    2.0\n",
       "202    3.0\n",
       "Name: quarter, Length: 203, dtype: float64"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.quarter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PeriodIndex(['1959Q1', '1959Q2', '1959Q3', '1959Q4', '1960Q1', '1960Q2',\n",
       "             '1960Q3', '1960Q4', '1961Q1', '1961Q2',\n",
       "             ...\n",
       "             '2007Q2', '2007Q3', '2007Q4', '2008Q1', '2008Q2', '2008Q3',\n",
       "             '2008Q4', '2009Q1', '2009Q2', '2009Q3'],\n",
       "            dtype='period[Q-DEC]', length=203, freq='Q-DEC')"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过将这些数组以及一个频率传入 PeriodIndex， 就可以将它们合并成 DataFrame 的一个索引：\n",
    "index = pd.PeriodIndex(year=data.year, quarter=data.quarter, freq='Q-DEC')\n",
    "\n",
    "index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "data.index = index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1959Q1    0.00\n",
       "1959Q2    2.34\n",
       "1959Q3    2.74\n",
       "1959Q4    0.27\n",
       "1960Q1    2.31\n",
       "          ... \n",
       "2008Q3   -3.16\n",
       "2008Q4   -8.79\n",
       "2009Q1    0.94\n",
       "2009Q2    3.37\n",
       "2009Q3    3.56\n",
       "Freq: Q-DEC, Name: infl, Length: 203, dtype: float64"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.infl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01    0.409295\n",
       "2000-01-02    0.406811\n",
       "2000-01-03   -0.826075\n",
       "2000-01-04   -0.213401\n",
       "2000-01-05   -1.825638\n",
       "                ...   \n",
       "2000-04-05   -0.608492\n",
       "2000-04-06    1.047503\n",
       "2000-04-07   -1.413037\n",
       "2000-04-08   -1.430302\n",
       "2000-04-09   -0.774278\n",
       "Freq: D, Length: 100, dtype: float64"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 重采样 以及 频率转换\n",
    "\n",
    "# 重采样（resampling） 指的是将时间序列从一个频率转换到另一个频率的处理过程。 \n",
    "#      将高频率数据聚合到低频率称为降采样（downsampling）\n",
    "#     而将低频率数据转换到高频率则称为升采样# （upsampling）\n",
    "# 并不是所有的重采样都能被划分到这两个大类中。 例如，将 W-WED（每周三）转换为 W-FRI 既不是降采样也不是升采样。\n",
    "\n",
    "# pandas 对象都带有一个 resample 方法， 它是各种频率转换工作的主力函数\n",
    "#    resample 有一个类似于 groupby 的 API，调用 resample 可以分组数据， 然后会调用一个聚合函数\n",
    "rng = pd.date_range('2000-01-01', periods=100, freq='D')\n",
    "\n",
    "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-31   -0.153540\n",
       "2000-02-29    0.016427\n",
       "2000-03-31   -0.141577\n",
       "2000-04-30   -0.120082\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.resample('M').mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01   -0.153540\n",
       "2000-02    0.016427\n",
       "2000-03   -0.141577\n",
       "2000-04   -0.120082\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.resample('M', kind='period').mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "# resample 是一个灵活高效的方法， 可用于处理非常大的时间序列\n",
    "# 表 11-5 总结它的一些选项"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![self](./../image/resample.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01 00:00:00     0\n",
       "2000-01-01 00:01:00     1\n",
       "2000-01-01 00:02:00     2\n",
       "2000-01-01 00:03:00     3\n",
       "2000-01-01 00:04:00     4\n",
       "2000-01-01 00:05:00     5\n",
       "2000-01-01 00:06:00     6\n",
       "2000-01-01 00:07:00     7\n",
       "2000-01-01 00:08:00     8\n",
       "2000-01-01 00:09:00     9\n",
       "2000-01-01 00:10:00    10\n",
       "2000-01-01 00:11:00    11\n",
       "Freq: T, dtype: int32"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 降采样\n",
    "\n",
    "# 将数据聚合到规律的低频率是一件非常普通的时间序列处理任务\n",
    "#  待聚合的数据不必拥有固定的频率， 期望的频率会自动定义聚合的面元边界， 这些面元用于将时间序列拆分为多个片段\n",
    "#  例如， 要转换到月度频率（'M'或'BM'），数据需要被划分到多个单月时间段中。 \n",
    "#  各时间段都是半开放的，一个数据点只能属于一个时间段，所有时间段的并集必须能组成整个时间帧\n",
    "# 在用 resample 对数据进行降采样时， 需要考虑两样东西：\n",
    "#     1、各区间哪边是闭合的。\n",
    "#     2、如何标记各个聚合面元， 用区间的开头还是末尾。\n",
    "rng = pd.date_range('2000-01-01', periods=12, freq='T')\n",
    "\n",
    "ts = pd.Series(np.arange(12), index=rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1999-12-31 23:55:00     0\n",
       "2000-01-01 00:00:00    15\n",
       "2000-01-01 00:05:00    40\n",
       "2000-01-01 00:10:00    11\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 假设想要通过求和的方式将这些数据聚合到 “5分钟” 块中：\n",
    "ts.resample('5min', closed='right').sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1999-12-31 23:55:00     0\n",
       "2000-01-01 00:00:00    15\n",
       "2000-01-01 00:05:00    40\n",
       "2000-01-01 00:10:00    11\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 传入的频率将会以 “5分钟” 的增量定义面元边界\n",
    "#  默认情况下， 面元的右边界是包含的， 因此 00:00 到 00:05 的区间中是包含 00:05 的\n",
    "# 传入 closed='left' 会让区间以左边界闭合：\n",
    "ts.resample('5min', closed='right').sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000-01-01 00:00:00     0\n",
       "2000-01-01 00:05:00    15\n",
       "2000-01-01 00:10:00    40\n",
       "2000-01-01 00:15:00    11\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如你所见， 最终的时间序列是以各面元右边界的时间戳进行标记的\n",
    "#  传入 label='right' 即可用面元的邮编界对其进行标记：\n",
    "ts.resample('5min', closed='right', label='right').sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如图说明了 “1分钟” 数据被转换为 “5分钟” 数据的处理过程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![self](./../image/1min.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1999-12-31 23:59:59     0\n",
       "2000-01-01 00:04:59    15\n",
       "2000-01-01 00:09:59    40\n",
       "2000-01-01 00:14:59    11\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.resample('5min', closed='right', label='right', loffset='-1s').sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1999-12-31 23:59:59     0\n",
       "2000-01-01 00:04:59    15\n",
       "2000-01-01 00:09:59    40\n",
       "2000-01-01 00:14:59    11\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 此外， 也可以通过调用结果对象的 shift 方法来实现该目的， 这样就不需要设置 loffset了\n",
    "ts.resample('5min', closed='right', label='right', loffset='-1s').sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-01 00:00:00</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-01 00:05:00</th>\n",
       "      <td>5</td>\n",
       "      <td>9</td>\n",
       "      <td>5</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-01 00:10:00</th>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     open  high  low  close\n",
       "2000-01-01 00:00:00     0     4    0      4\n",
       "2000-01-01 00:05:00     5     9    5      9\n",
       "2000-01-01 00:10:00    10    11   10     11"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# OHLC重采样\n",
    "\n",
    "# 金融领域中有一种无所不在的时间序列聚合方式， 即计算各面元的四个值： \n",
    "#    第一个值（open， 开盘）\n",
    "#    最后一个值（close， 收盘）\n",
    "#    最大值（high， 最高） \n",
    "#    最小值（low， 最低）\n",
    "\n",
    "# 传入 how='ohlc' 即可得到一个含有这四种聚合值的 DataFrame\n",
    "#  整个过程很高效， 只需一次扫描即可计算出结果：\n",
    "ts.resample('5min').ohlc()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-05</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-12</th>\n",
       "      <td>0.473376</td>\n",
       "      <td>-0.726353</td>\n",
       "      <td>0.979377</td>\n",
       "      <td>-0.177623</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2000-01-05  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-12  0.473376 -0.726353  0.979377 -0.177623"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 升采样 和 插值\n",
    "\n",
    "# 在将数据从低频率转换到高频率时，就不需要聚合了\n",
    "#  来看一个带有一些周型数据的 DataFrame：\n",
    "frame = pd.DataFrame(np.random.randn(2, 4), \n",
    "                     index=pd.date_range('1/1/2000', periods=2, freq='W-WED'),\n",
    "                     columns=['Colorado', 'Texas', 'New York', 'Ohio'])\n",
    "frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-05</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-06</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-07</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-08</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-09</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-10</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-11</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-12</th>\n",
       "      <td>0.473376</td>\n",
       "      <td>-0.726353</td>\n",
       "      <td>0.979377</td>\n",
       "      <td>-0.177623</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2000-01-05  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-06       NaN       NaN       NaN       NaN\n",
       "2000-01-07       NaN       NaN       NaN       NaN\n",
       "2000-01-08       NaN       NaN       NaN       NaN\n",
       "2000-01-09       NaN       NaN       NaN       NaN\n",
       "2000-01-10       NaN       NaN       NaN       NaN\n",
       "2000-01-11       NaN       NaN       NaN       NaN\n",
       "2000-01-12  0.473376 -0.726353  0.979377 -0.177623"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当对这个数据进行聚合，每组只有一个值，这样就会引入缺失值\n",
    "# 使用 asfreq 方法转换成高频，不经过聚合：\n",
    "df_daily = frame.resample('D').asfreq()\n",
    "df_daily"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-05</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-06</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-07</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-08</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-09</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-10</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-11</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-12</th>\n",
       "      <td>0.473376</td>\n",
       "      <td>-0.726353</td>\n",
       "      <td>0.979377</td>\n",
       "      <td>-0.177623</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2000-01-05  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-06  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-07  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-08  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-09  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-10  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-11  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-12  0.473376 -0.726353  0.979377 -0.177623"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 假设想要用前面的周型值填充 “非星期三”\n",
    "# resampling 的填充和插值方式跟 fillna 和 reindex 的一样：\n",
    "frame.resample('D').ffill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-05</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-06</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-07</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-08</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-09</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-10</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-11</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-12</th>\n",
       "      <td>0.473376</td>\n",
       "      <td>-0.726353</td>\n",
       "      <td>0.979377</td>\n",
       "      <td>-0.177623</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2000-01-05  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-06  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-07  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-08       NaN       NaN       NaN       NaN\n",
       "2000-01-09       NaN       NaN       NaN       NaN\n",
       "2000-01-10       NaN       NaN       NaN       NaN\n",
       "2000-01-11       NaN       NaN       NaN       NaN\n",
       "2000-01-12  0.473376 -0.726353  0.979377 -0.177623"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 同样， 这里也可以只填充指定的时期数（目的是限制前面的观测值的持续使用距离） ：\n",
    "frame.resample('D').ffill(limit=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-06</th>\n",
       "      <td>0.587689</td>\n",
       "      <td>0.212900</td>\n",
       "      <td>0.047832</td>\n",
       "      <td>0.862788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-13</th>\n",
       "      <td>0.473376</td>\n",
       "      <td>-0.726353</td>\n",
       "      <td>0.979377</td>\n",
       "      <td>-0.177623</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Colorado     Texas  New York      Ohio\n",
       "2000-01-06  0.587689  0.212900  0.047832  0.862788\n",
       "2000-01-13  0.473376 -0.726353  0.979377 -0.177623"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 注意， 新的日期索引完全没必要跟旧的重叠：\n",
    "frame.resample('W-THU').ffill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01</th>\n",
       "      <td>1.042092</td>\n",
       "      <td>0.138801</td>\n",
       "      <td>0.032719</td>\n",
       "      <td>-0.751945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02</th>\n",
       "      <td>-1.349503</td>\n",
       "      <td>-0.340690</td>\n",
       "      <td>-2.258120</td>\n",
       "      <td>0.156719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-03</th>\n",
       "      <td>0.103710</td>\n",
       "      <td>-0.984480</td>\n",
       "      <td>0.378084</td>\n",
       "      <td>0.214060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-04</th>\n",
       "      <td>-0.202809</td>\n",
       "      <td>-2.077562</td>\n",
       "      <td>0.848910</td>\n",
       "      <td>1.070752</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-05</th>\n",
       "      <td>0.171810</td>\n",
       "      <td>0.817024</td>\n",
       "      <td>0.840725</td>\n",
       "      <td>-0.744837</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Colorado     Texas  New York      Ohio\n",
       "2000-01  1.042092  0.138801  0.032719 -0.751945\n",
       "2000-02 -1.349503 -0.340690 -2.258120  0.156719\n",
       "2000-03  0.103710 -0.984480  0.378084  0.214060\n",
       "2000-04 -0.202809 -2.077562  0.848910  1.070752\n",
       "2000-05  0.171810  0.817024  0.840725 -0.744837"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过时期进行重采样\n",
    "\n",
    "# 对那些使用时期索引的数据进行重采样与时间戳很像：\n",
    "frame = pd.DataFrame(np.random.randn(24, 4),\n",
    "                     index=pd.period_range('1-2000', '12-2001', freq='M'),\n",
    "                     columns=['Colorado', 'Texas', 'New York', 'Ohio'])\n",
    "\n",
    "frame[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Colorado     Texas  New York      Ohio\n",
       "2000 -0.447462  0.048087  0.096606  0.241652\n",
       "2001 -0.199349  0.284217  0.306166 -0.044864"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "annual_frame = frame.resample('A-DEC').mean()\n",
    "\n",
    "annual_frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000Q1</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000Q2</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000Q3</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000Q4</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q1</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q2</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q3</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q4</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Colorado     Texas  New York      Ohio\n",
       "2000Q1 -0.447462  0.048087  0.096606  0.241652\n",
       "2000Q2 -0.447462  0.048087  0.096606  0.241652\n",
       "2000Q3 -0.447462  0.048087  0.096606  0.241652\n",
       "2000Q4 -0.447462  0.048087  0.096606  0.241652\n",
       "2001Q1 -0.199349  0.284217  0.306166 -0.044864\n",
       "2001Q2 -0.199349  0.284217  0.306166 -0.044864\n",
       "2001Q3 -0.199349  0.284217  0.306166 -0.044864\n",
       "2001Q4 -0.199349  0.284217  0.306166 -0.044864"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 升采样要稍微麻烦一些， 因为必须决定在新频率中各区间的哪端用于放置原来的值， \n",
    "# 就像 asfreq 方法那样。 convention 参数默认为 'start'， 也可设置为 'end'：\n",
    "#\n",
    "# Q-DEC: Quarterly, year ending in December\n",
    "annual_frame.resample('Q-DEC').ffill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Colorado</th>\n",
       "      <th>Texas</th>\n",
       "      <th>New York</th>\n",
       "      <th>Ohio</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000Q4</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q1</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q2</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q3</th>\n",
       "      <td>-0.447462</td>\n",
       "      <td>0.048087</td>\n",
       "      <td>0.096606</td>\n",
       "      <td>0.241652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2001Q4</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2002Q1</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2002Q2</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2002Q3</th>\n",
       "      <td>-0.199349</td>\n",
       "      <td>0.284217</td>\n",
       "      <td>0.306166</td>\n",
       "      <td>-0.044864</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Colorado     Texas  New York      Ohio\n",
       "2000Q4 -0.447462  0.048087  0.096606  0.241652\n",
       "2001Q1 -0.447462  0.048087  0.096606  0.241652\n",
       "2001Q2 -0.447462  0.048087  0.096606  0.241652\n",
       "2001Q3 -0.447462  0.048087  0.096606  0.241652\n",
       "2001Q4 -0.199349  0.284217  0.306166 -0.044864\n",
       "2002Q1 -0.199349  0.284217  0.306166 -0.044864\n",
       "2002Q2 -0.199349  0.284217  0.306166 -0.044864\n",
       "2002Q3 -0.199349  0.284217  0.306166 -0.044864"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 由于时期指的是时间区间， 所以升采样和降采样的规则就比较严格：\n",
    "#     1\\ 在降采样中， 目标频率必须是源频率的子时期（subperiod） 。\n",
    "#     2\\ 在升采样中， 目标频率必须是源频率的超时期（superperiod） 。\n",
    "\n",
    "# 如果不满足这些条件， 就会引发异常\n",
    "# 这主要影响的是按季、 年、 周计算的频率\n",
    "# 例如， 由 QMAR 定义的时间区间只能升采样为 A-MAR、 A-JUN、 A-SEP、 A-DEC等：\n",
    "annual_frame.resample('Q-MAR').ffill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x99d0848>"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 移动窗口函数\n",
    "\n",
    "# 在移动窗口（可以带有指数衰减权数）上计算的各种统计函数也是一类常见的用于时间序列的数组变换\n",
    "# 这样可以圆滑噪声数据或者断裂数据，称之为 移动窗口函数 moving window function\n",
    "# 其中还包括哪些窗口不定长的函数（如 指数加权移动平均）\n",
    "# 跟其他统计函数一致， 移动窗口函数也会自动排除缺失值\n",
    "\n",
    "# 加载一些时间序列数据，将其重采样为工作日频率\n",
    "close_px_all = pd.read_csv(dataset_path + 'stock_px_2.csv', parse_dates=True, index_col=0)\n",
    "\n",
    "close_px = close_px_all[['AAPL', 'MSFT', 'XOM']]\n",
    "\n",
    "close_px = close_px.resample('B').ffill()\n",
    "\n",
    "# 现在引入 rolling 运算符， 它与 resample 和 groupby 很像\n",
    "# 可以在 TimeSeries 或 DataFrame 以及一个 window（表示期数）上调用它\n",
    "close_px.AAPL.plot()\n",
    "close_px.AAPL.rolling(250).mean().plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2003-01-09         NaN\n",
       "2003-01-10         NaN\n",
       "2003-01-13         NaN\n",
       "2003-01-14         NaN\n",
       "2003-01-15    0.077496\n",
       "2003-01-16    0.074760\n",
       "2003-01-17    0.112368\n",
       "Freq: B, Name: AAPL, dtype: float64"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 表达式 rolling(250) 与 groupby 很像， 但不是对其进行分组，\n",
    "# 而是创建一个按照 250 天分组的滑动窗口对象\n",
    "#  然后， 就得到了苹果公司股价的250天的移动窗口\n",
    "\n",
    "# 默认情况下， rolling 函数需要窗口中所有的值为 非 NA值\n",
    "#  可以修改该行为以解决缺失数据的问题\n",
    "# 其实， 在时间序列开始处尚不足窗口期的那些数据就是个特例\n",
    "\n",
    "appl_std250 = close_px.AAPL.rolling(250, min_periods=10).std()\n",
    "appl_std250[5:12]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xaa78d08>"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "appl_std250.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xab8fdc8>"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 要计算扩展窗口平均（expanding window mean） \n",
    "#     可以使用 expanding 而不是 rolling\n",
    "#  “扩展” 意味着， 从时间序列的起始处开始窗口， 增加窗口直到它超过所有的序列\n",
    "\n",
    "# apple_std250 时间序列的扩展窗口平均如下所示\n",
    "expanding_mean = appl_std250.expanding().mean()\n",
    "\n",
    "# 对 DataFrame 调用 rolling_mean（以及与之类似的函数） 会将转换应用到所有的列上\n",
    "close_px.rolling(60).mean().plot(logy=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AAPL</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>XOM</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-01-02</th>\n",
       "      <td>7.400000</td>\n",
       "      <td>21.110000</td>\n",
       "      <td>29.220000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-01-03</th>\n",
       "      <td>7.425000</td>\n",
       "      <td>21.125000</td>\n",
       "      <td>29.230000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-01-06</th>\n",
       "      <td>7.433333</td>\n",
       "      <td>21.256667</td>\n",
       "      <td>29.473333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-01-07</th>\n",
       "      <td>7.432500</td>\n",
       "      <td>21.425000</td>\n",
       "      <td>29.342500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-01-08</th>\n",
       "      <td>7.402000</td>\n",
       "      <td>21.402000</td>\n",
       "      <td>29.240000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2011-10-10</th>\n",
       "      <td>389.351429</td>\n",
       "      <td>25.602143</td>\n",
       "      <td>72.527857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2011-10-11</th>\n",
       "      <td>388.505000</td>\n",
       "      <td>25.674286</td>\n",
       "      <td>72.835000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2011-10-12</th>\n",
       "      <td>388.531429</td>\n",
       "      <td>25.810000</td>\n",
       "      <td>73.400714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2011-10-13</th>\n",
       "      <td>388.826429</td>\n",
       "      <td>25.961429</td>\n",
       "      <td>73.905000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2011-10-14</th>\n",
       "      <td>391.038000</td>\n",
       "      <td>26.048667</td>\n",
       "      <td>74.185333</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2292 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                  AAPL       MSFT        XOM\n",
       "2003-01-02    7.400000  21.110000  29.220000\n",
       "2003-01-03    7.425000  21.125000  29.230000\n",
       "2003-01-06    7.433333  21.256667  29.473333\n",
       "2003-01-07    7.432500  21.425000  29.342500\n",
       "2003-01-08    7.402000  21.402000  29.240000\n",
       "...                ...        ...        ...\n",
       "2011-10-10  389.351429  25.602143  72.527857\n",
       "2011-10-11  388.505000  25.674286  72.835000\n",
       "2011-10-12  388.531429  25.810000  73.400714\n",
       "2011-10-13  388.826429  25.961429  73.905000\n",
       "2011-10-14  391.038000  26.048667  74.185333\n",
       "\n",
       "[2292 rows x 3 columns]"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# rolling 函数也可以接受一个指定固定大小时间补偿字符串， 而不是一组时期\n",
    "#  这样可以方便处理不规律的时间序列\n",
    "# 这些字符串也可以传递给 resample\n",
    "# 例如，可以计算 20 天的滚动均值， 如下所示：\n",
    "close_px.rolling('20D').mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xaeaca48>"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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v3v3br3pppu0W7duuZ45My/i4+N1+PDh6T9yvr6++sEHH9gFSca4kCX3fJCamqo//vijHjx4ML0sOTlZd+zYoWvWrNGVK1fq8ePH83WfDodDP/roIy1RooTecMMNOmDAAAW0V69ehXbC0uFw6MyZM7V8+fIKpI/8sXvWGuN6ltyLuB07dmidOnXUz89PO3TooIA+8MADmpqaWmD7dDgcun37du3evbsC2rx5c50xY4Z6eXnZSVNj3IQldw9w/PhxjYqKUkCrVq2qgL711lv5vp/Vq1drVFSUBgYGpne/vP766+l/KWzdurXIjcE3xlNlldzzNP2AiJQTka9EZKeI7BCR5iJyg4gsE5FY57/l87IPkyYgIIAvv/ySzz//nKSkJHx9fTl+/DgnTpzIt30sXLiQVq1asXLlSjp27MiUKVPYunUr69at45tvvgEgNDTUphAwpgjI69wy44AlqlobaADsAIYBP6hqTeAH52uTD0SEXr168euvv9K1a1feeustgoKCKF++PEOGDOHcuXO53vb//vc/7rvvPho2bMju3bv5+OOPqVOnDvfffz8LFizg0KFD+fhOjDEFLrMmfXYPoAzwB8454S8p3wXc6Hx+I7Aru21Zt0zubNy4UZ988kktVqyYAlqsWDG9//77dceOHde0nfj4eK1Ro4ZWqlRJDxw4oNu3b9fOnTsroJUqVdI5c+YU0DswxuQFBdHnDoQB64DpwCZgClASOHlFvb8yWb8/sAHYUK1atcL5JDxUUlKS9u7dW319fdOHZYaHh+uKFSuyXTclJUXvuOMO9fX11VWrVqmq6pw5c7RMmTL66quvamJiYkGHb4zJpaySe166ZXyARsBEVW0IJHENXTCqOklVw1U1PCgoKA9hGH9/f2bOnMnJkyd5+eWXqVu3LocPH+bWW2+la9eu7N+/P8P1VJUhQ4bw3XffMXToUPbs2QNAly5d2Lt3L8OHD7cbihtTVGWW9bN7AJWAvZe8bgV8jXXLuIWkpCQdOnSoioiWKlUqvVV+UUpKivbt21cBvf3227V48eJ68803252pjClCKIiWu6oeBvaLSC1nUVtgO7AQeMBZ9gCwILf7MLnn7+/PI488Qvv27UlMTKRly5ZER0cDsHv3btq3b8+UKVOoX78+S5cupXnz5qxevZpixYq5OHJjTH7I0w2yRSSMtL52P+B34CHS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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 指数加权函数\n",
    "\n",
    "# 另一种使用固定大小窗口及相等权数观测值的办法是， 定义一个衰减因子（decay factor） 常量，\n",
    "# 以便使近期的观测值拥有更大的权数。 \n",
    "\n",
    "#  衰减因子的定义方式有很多， 比较流行的是使用时间间隔 （span） ，\n",
    "#  它可以使结果兼容于窗口大小等于时间间隔的简单移动窗口（simple moving window） 函数。\n",
    "# 由于指数加权统计会赋予近期的观测值更大的权数， 因此相对于等权统计， 它能 “适应” 更快的变化\n",
    "\n",
    "# 除了 rolling 和 expanding， pandas 还有 ewm 运算符\n",
    "# 下面这个例子对比了苹果公司股价的 30 日移动\n",
    "# 平均 和 span=30 的指数加权移动平均\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "aapl_px = close_px.AAPL['2006':'2007']\n",
    "\n",
    "ma60 = aapl_px.rolling(30, min_periods=20).mean()\n",
    "\n",
    "ewma60 = aapl_px.ewm(span=30).mean()\n",
    "\n",
    "ma60.plot(style='k--', label='Simple MA')\n",
    "\n",
    "ewma60.plot(style='k-', label='EW MA')\n",
    "\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xaf57ac8>"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 二元移动窗口函数\n",
    "\n",
    "# 有些统计运算（如相关系数和协方差） 需要在两个时间序列上执行\n",
    "#  例如， 金融分析师常常对某只股票对某个参考指数（如标准普尔500指数） 的相关系数感兴趣\n",
    "#  要进行说明，先计算感兴趣的时间序列的百分数变化：\n",
    "spx_px = close_px_all['SPX']\n",
    "\n",
    "spx_rets = spx_px.pct_change()\n",
    "\n",
    "returns = close_px.pct_change()\n",
    "\n",
    "# 调用rolling之后， corr聚合函数开始计算与spx_rets滚动相关系数（结果见图11-8） ：\n",
    "corr = returns.AAPL.rolling(125, min_periods=100).corr(spx_rets)\n",
    "\n",
    "corr.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xae4a088>"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 假设想要一次性计算多只股票与标准普尔500指数的相关系数\n",
    "# 虽然编写一个循环并新建一个 DataFrame 不是什么难事， 但比较啰嗦\n",
    "#  其实， 只需传入一个 TimeSeries 和一个 DataFrame，\n",
    "# rolling_corr 就会自动计算 TimeSeries（本例中就是spx_rets） 与 DataFrame 各列的相关系数\n",
    "\n",
    "corr = returns.rolling(125, min_periods=100).corr(spx_rets)\n",
    "corr.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xc038508>"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXhcZdn48e892dc2bZPu6V7aAm1pQ1kKBUrLqrIoAiqLihUFFX8ggij46ssrCoq+bq8VUFEEZUeRXRAKXeje0n1N03RJszTrJDOT5/fHOWcyM5kkk2SSWXJ/ritXZs42d06Se565z3OeR4wxKKWUSl6uWAeglFKqb2miV0qpJKeJXimlkpwmeqWUSnKa6JVSKsmlxjqAcIYNG2bGjx8f6zCUUiphrFmz5pgxpjDcurhM9OPHj2f16tWxDkMppRKGiOzvaJ2WbpRSKslpoldKqSSniV4ppZKcJnqllEpymuiVUirJaaJXSqkkp4leKaWSXFz2o1dKqYFof2UDz649SGOzl2P1zTx89WxEpNfH1USvlFJx4vHl+3l02V7/88+dPo6S8UN6fVwt3SilVJxobPFSmJfhf17f7I3KcTXRK6VUnGj2tJKRGv20rIleKaXixH92VJCZluJ//pNXt/O3D0spr2nq1XE10SulVBwoq26ksqGFZq+PRdOLANhyqJZvP7uJX7y5s1fH1kSvlFJxoM5t1ePvuOAEfn99CdecOrZtXbOnV8fWRK+UUnHA7fEBkJ+ZhohQkJMesK61V8fW7pVKKRVj9c1e1uyvBiAjrX37+2B1xzX6Q8eb2F/Z2OnxI0r0IvIN4EuAAL83xvxcRB4EPg60ALuBzxtjasLsuw+oA3yA1xhTEslrKqXUQPGz13fw2PtW//lhuVb3ymkj8vzrd1fUd7jv5x5Zye6Khk6P32XpRkROwkry84BZwMdEZArwBnCSMWYmsAO4u5PDnGeMma1JXiml2qtubKEoL4NXbzubqcOtBP/xmaN48/+dw9UlY3G5Or479vBxd5fHj6RGPx1YYYxpNMZ4gf8AVxhjXrefA6wAxkRwLKWUUiHcHh+DstKYNiLfv8zlEiYX5VKUn4HH14oxJuy+kQyREEmi3wwsEJGhIpINXAKMDdnmC8ArHexvgNdFZI2ILIng9ZRSasA4UuumqqElqP98oMy0FIyB7UfqON7kobK+Ga+vld0V9ew4UhfR3bNd1uiNMVtF5MdYpZp6YAPgP7KI3GM/f6KDQ8w3xpSLSBHwhohsM8a8G7qR/SawBKC4uLjLwJVSKtHtr2zgnAffAWD+5KFht8nPSgPgop+/51+WlZZCk91LJxIRda80xjxqjJljjFkAVAE7AUTkBuBjwGdNB58rjDHl9vejwPNYtf5w2y01xpQYY0oKCwsj/gGUUipRHaltBuCW8ybxoytmht3mk3NG85vPzuGiE0f4l4Um+a6qNxElers1jogUA1cCT4rIRcC3gU8YY8L27RGRHBHJcx4DF2CVgpRSasBz+s4vnFZE8dDssNtkp6dyyckjOXnMoLDrF00fTlHAQGjhRNqP/lkRGQp4gFuMMdUi8isgA6scA9YF25tFZBTwiDHmEmA48Ly9PhX4qzHm1QhfUymlklpji1UFz0gNX58P1FENv6t1EGGiN8acHWbZ5A62Lce6YIsxZg9Wl0yllFIBSisbufkvawHIyeg6Fad20MVyTEEWe4513M8e9M5YpZSKibLqtor3+A7KNoHGhWxzztRCrj51LAunFXGgqpG3O9lXx7pRSqkYcHvbLqhG0he+KC8z6Pn0kflccvJIMtNSOHVC57NQaaJXSqkY6O5AZZkhY+AEPs/sYrISTfRKKRUDa+1BzCKVlR58wTXwAmxULsYqpZSKLqda84trZke0/Yj8TG5fPBURqG70cOnJI/3rpgYMgBaOJnqllIoBt6eVguw0Lps9OqLtRYSvnT8l7Lo5xQWd7qulG6WUigG3x9dlySVaNNErpVQfqmls4dqlK7j81++zttSqy1fUNfP0mjIyuriIGi2a6JVSqg9tP1zH8j2VrD9Qw4o9lQBsPVQLwJxxnZdcokUTvVJK9SG3t60bpdOl0hnj5gvzJ/RLDJrolVKqD7kDRppsth87yT+0b3xf0V43SikVRTuO1PGLN3ficgl3XTyNZ9eU+de9svkwlQ0tzLRHooxkMLNo0ESvlFJR9MaWI7y86RAAC6YMo7TKGtPmqrljWL6nkmfWlNHaak3fob1ulFIqAQWWatzeVtweH5fNHsWDV83iwU9Zg/keb/IA/Ve60USvlFJRFFqTd3taybRLNE5ir25ssZ9r6UYppeLWH9/fS1l1E9edMY5j9c38c6NVrvnD+/vISHXR7G3llc2HqW5s8Sd4Z7yaPccaSHUJaSl6MVYppeJSY4uX7/9jCwC5malsPVTLG1uOYJfeafa2ckrxYHYcqSMzLYWZYwYDMGpwFsVDsqlubGFeF0MLR1NEiV5EvgF8CRDg98aYn4vIEOBvwHhgH/BpY0y74djsCcS/az/9b2PMn6IQt1JKxUxTS1t5psnjo7HFx8wxg/nMacXc+cxGPjV3DA9d1X5yvfzMNN6987z+DBWIoEYvIidhJfl5WNMCfkxEpgB3AW8ZY6YAb9nPQ/cdAtwHnGbvf5+I9M+tYEop1UcCb4Jq9rTS7Gm1yjMmhkF1IpIC0XSsib8bjTFe4D/AFcBlgNM6/xNweZh9LwTeMMZU2a39N4CLeh+2Ukr1P6sWX85Tq0r9y/74wT4O1jT124XVnoikdLMZuF9EhgJNWBN/rwaGG2MOARhjDolIUZh9RwMHAp6X2cvaEZElwBKA4uLiiH8ApZTqL1f/bjm7KxoASHEJPrsof7CmiQtOHE7JeKtg8YlZo2IWYzhdJnpjzFYR+TFWa7we2AB4Izx+uIkQw364McYsBZYClJSUxOkHIKXUQOYkeRHY/P0LmX7vqwA8+5UzmFNcgIiw74FLYxliWBH17THGPGqMmWOMWQBUATuBIyIyEsD+fjTMrmXA2IDnY4Dy3oWslFKxJQRP7TckJyOiCb5jJaJE75RlRKQYuBJ4EngJuMHe5AbgxTC7vgZcICIF9kXYC+xlSimVUAJvhGoNqTn01x2uPRVpdM+KyBbgH8At9oXVB4DFIrITWGw/R0RKROQRAGNMFfBD4EP76wf2MqWUSigv2zdEAUwuygXgs6dZ1xPzM9NiElOkxJj4K4eXlJSY1atXxzoMpZTye3TZXn74zy38+YvzmDV2MPmZaXh9rVQ3eijMy4h1eIjIGmNMSbh1emesUkpFoNlrlW5OHT/E35UyNcUVF0m+K5rolVJJr7SykTEFWbhckV8w3V1RT0Ozl8K8DLYfrqO00hpuuL/meY0mTfRKqaS2+eBxPvbLZdxzyXS+tGBiRPvsPFLH4offbbd8cHZaXPeu6UjivTUppVQ3HDruBvBPzB2JivrmsMuf/vIZUYmpv2miV0oltZ50OGn2tLZbNqkwhynD86IRUr/T0o1SKqk5k3x05niThxZvKwXZaTR7W6mos1r0qS7Ba3ea76+x4/uCJnqlVNLadbSObz+7CbDGpgln1d4qPv275QCcOWko60praLJvjhqen8nBmiYAZozK74eI+4YmeqVU0iqrbvI/HpqbHnabA/bk3cPzM/xJ/qq5YzhvWhGTCnN5b2cFe481cN/HT+yXmPuCJnqlVNJyB9Ta3WHq7gBuu3988ZBsPtxnzZ10/vQiLjppJAAnjEjMunygxC06KaVUF5ybnFwSPFZNIOcNYFBW2zAGGXE8tnxPaIteKZW0vvHUegCG5mbw6keHGX/Xy0Hri/Iy/OPWDMlpK+1ka6JXSqn450wKMmpQJj/51Cxe3nSIJwNmhgI4WtfM8PxMAJYsmMjQ3Axy0lOYXTy43+PtS5rolVJJySnbXHfGeM6aMowJhTntEj1ATVML00bkMbkoj29fNK2/w+wXWqNXSiUlp/bujBXf0Rg1NY2euJ7vNRo00SulktLSd/cA+JN4Rzc81bm9CTlQWXdo6UYplZQ2HawB4JyphYDVq2buuAIKczMYOTiTzQeP+7tTxt+sHNGliV4plZTcnlbOnDSUUYOz/Mue/cqZ/sdbD9Vy8S/eA2DuuIJ+j68/RZToReSbwE1Yb3ybgM8DbwDOnQRFwCpjzOVh9vXZ+wCUGmM+0duglVKqK26PL6hvfKjAunxmanLX6LtM9CIyGvg6MMMY0yQifweuMcacHbDNs4SfHBygyRgzOyrRKqVUBJq9Pj4qr2Xc0OwOtwmc0DveJ/furUhLN6lAloh4gGyg3FkhInnAQqxWvlJKxdx+ezaozlr0hbkZXDpzJJX1zcyfPKy/QouJLhO9MeagiDwElAJNwOvGmNcDNrkCeMsYU9vBITJFZDXgBR4wxrwQbiMRWQIsASguLu7Gj6CUUsGc4Q4WThve4TapKS5+/Zk5/RVSTHX5eUVECoDLgAnAKCBHRD4XsMm1wJOdHKLYnpn8M8DPRWRSuI2MMUuNMSXGmJLCwsKIfwCllAoV2od+oIvkLCwC9hpjKowxHuA54EwAERkKzANe7mhnY0y5/X0P8A5wSi9jVkqpTjkt+qwkvxEqUpEk+lLgdBHJFmtW3POBrfa6q4B/GmPc4XYUkQIRybAfDwPmA1t6H7ZSSnXMSfTJfsdrpLpM9MaYlcAzwFqsbpIuYKm9+hpCyjYiUiIij9hPpwOrRWQD8DZWjV4TvVKqT7m9WroJFFGvG2PMfcB9YZafG2bZaqw+9xhjPgBO7l2ISinVPU6LPiPJ+8dHSt/ulFJJp1lLN0E00Sulko72ugmmZ0EplXSatEUfRBO9UirpuD0+UlzS4dDEA42eBaVU0nF7WslM8jHmu0PPhFIq6bi9Pi3bBNBEr5RKOm6PJvpAmuiVUkmn2dOqPW4C6JlQSiWdzeXHtUUfQBO9UiqpHKhqZH9lIx5fa6xDiRua6JVSSaWqoQWAJQvCjog+IGmiV0olFWecm5GDMmMcSfzQRK+UShq+VsNH5dZkd1qjbxPpnLFKKRX3PvvIClbsqQJgUJamN4e26JVSScNJ8gCTCnNjGEl80USvlEpK1oR4CjTRK6VU0oso0YvIN0XkIxHZLCJPikimiPxRRPaKyHr7a3YH+94gIjvtrxuiG75SSqmudHm1QkRGA18HZhhjmkTk71hzxQJ8yxjzTCf7DsGagrAEMMAaEXnJGFPd+9CVUirY5KJcdh2t519fPzvWocSVSEs3qUCWiKQC2UB5hPtdCLxhjKmyk/sbwEXdD1MppbrWagyXnjySGaPyYx1KXOky0RtjDgIPAaXAIeC4MeZ1e/X9IrJRRB4WkYwwu48GDgQ8L7OXtSMiS0RktYisrqio6NYPoZRSYA1mlqGDmbXT5RkRkQLgMmACMArIEZHPAXcD04BTgSHAt8PtHmaZCfc6xpilxpgSY0xJYWFhhOErFVvGGC58+F1eXH8w1qEodHjijkTy1rcI2GuMqTDGeIDngDONMYeMpRn4AzAvzL5lwNiA52OIvOyjVNxr9ray/Ugd3/zb+liHorATfaom+lCRJPpS4HQRyRarY+r5wFYRGQlgL7sc2Bxm39eAC0SkwP5kcIG9TKmk0OyxRkgM+zFV9Tu3V8ehD6fLXjfGmJUi8gywFvAC64ClwCsiUohVnlkP3AwgIiXAzcaYm4wxVSLyQ+BD+3A/MMZUtXsRpRKU2+uLdQjK5vG14ms1ZGnppp2I3vqMMfcZY6YZY04yxlxnjGk2xiw0xpxsL/ucMabe3na1MeamgH0fM8ZMtr/+0Fc/SLLZdriW6d97lVueWBvrUFQn1pVaPYWNgc//YZWOgR5D7+6wOnFojb49/YwTpx5btpcmj4+XNx2itVULA/Fq77FG/+O3t1dw+Lg7htEMbKv3W2+655ygnTlCaaKPUx5fW3Jv9morMV45Y587mrWUEzNuj4+8zFSmDs+LdShxRxN9AghNJip+hNbo3R59U44V7VrZMU30ceDp1Qe45/lNeO36rq/V8Py6tn7ZkVzw21/ZwO1/38CBqsYut1WReXr1Ab7z/KZO6+6vbDoc9Pzx5fv6NigV1oGqRp5cdYCMVE1p4ehZiQPfemYjT6wsZV+llaRDk3VTS9eJ/tm1B3l2bRkvbzrUJzEORN96ZiN/XVnK/sqGDrdptH83YwqyAFi1VzuVxcK7O60LsadNGBrjSOKTJvo44pRonBb8ZbNH2cu7LgcEfhpQ0dXZ+W/x+rjxzPEs+/ZCrpo7Rq+nxIjzO7r3YzNiHEl80kQfR5wLec4f7aCsNOt5BKUbTe99p7NrJG5v29gqmWkpej0lRpzzruPchKeTKsbYnop6/+N3dxxj7rghvL/rGACD7UR/oKqROcUF7fbdfPA4z609yMubyjlS2wzAR+XH/eu3Ha7ljqc3kOJyMWpQJj+47CQK88KNPde5supGXtpQzpKzJ5KaMjD+kSrrm/2PS6saKRk/hBfWHWRdaTVXzBnDtkO1HK510+Jt9d9yn5HqorrRw5FaN8PzM2MV+oCz62gdD72+HUBr9B3QRB9jD7yyzf945d5KAJbvtr7PmzAU2EVFXXO4XXns/b08tzZ4MK2WgNLBPc9vZvPBWgA2HID5k4fxudPHdTvGH72yjZc3HuKsycOYOWZwt/dPRG9uPeJ/7Jz/2+zxbP60fH/QtieNHgTApCJrjtJXNh3ixvkT+iNMBfx15QGMgVPHF+j0gR3Qt78YOxbQcnSSdIu3ldMnDqFkvNWK76juG+4ibeC2h2qagtb1tKxQZl8cbhlA9efGgHPb1c+9eMZwAC6fbY3A3aRdLPtVk8dLYV4GT998ZqxDiVua6GOsJaDrnlObd3ut/sDOx9DmDhJ0uMTd3EmS6W39eCD1EQ/8WSMdz8b5fWmdvn+5PTqQWVf07MRYaEI5WNPExrLjpKe4EBFSXcIfPthHWXUjb209wisB3Se3Hqprd7xV+6rYXVHPY8v2Uh5yO/5j7++jPKSV35lth2vZd6yta2H58cj3TTQf7D7G1kO1/ufvbD8KQFZaCqv2VrFmf9fdJl0uq2zwi7d2UtPYwuPL9wX9vlT0GWN4/aPDOjRxF7RGH2NDc9LZZT9u9rRy93ObANhtX6SdXJTLtsN1/Prt3Ty5qhSAdd9bTEFOOrVuT9Cx8jJSqWv2cv2jqzgYJqFXNbTwyHt7uffjkXVBu+jn7wFw9pRhQFsJJxl95vcryctIZdN/XQjASrs/fHZ6Ch/uq+aTv13erePd8/xm/z0N6+9dzODs9OgGrAAoq26iocWng8l1QRN9jGWkpTBr7GBOGpXPq5sPs/uoleCd/vD/+NpZzLv/zaBeIA0tXgpy0vG2Gm46awL3XDqdxhYfeyoa+PivlnG0rq0lf3XJWH78qZl4fK2c8oM3aGj2djtGp5tnsnfRr7PPjXPubz1vctAdygXZaVQ3Wm+u79+1kPzMVPIy08Ie60B125tiQ4uPwdl9FfXAVue2fmffunBajCOJb1q6iTF3i4/MVFeHfbDTUlwMy82gprGt9e72tGKMocXbSnZ6CiJCTkaqv04ZOCBaflaq/zhDc9N7NH66/9pBktaejQl+B3PuZ8jNTA3ql12Q09YqH5qT3mGSh+BzlaznLR44f8/ZGVq66Ywm+hjbV9lAZloKmWkuGlp8YUsumWkprNrXViPecqjW37smI2AQp3ADOqUH9CvOTE0JqrkD1Lk9vLnlCMebPKG7+jl1/USfZMPja2XFnkr/XcRH69y8uvkw/9zYVkd3e3y8s90e1zzVRXpK8PlzdNVfe8eRtvsjth+uo74Hn6RU1/xj0GuNvlMRJXoR+aaIfCQim0XkSRHJFJEnRGS7vewxEQnbvBERn4ist79eim74ie9oXTMNzV7KqoMT/KUzR/ofh9Yfv/7kOn/vmsDkPii7/a9gWG7bDVINLe1f59Fle7np8dX83392dxjjFvsiZaL3unlmTRnXLF3hr53/4B9buPkva/jak+v829z5zEa+ak/2YiDoBrPCvAwmDsvBJXTYX3ve+CHtln31ibVc/+jKKP4kCqC0spGfv7kTQHvddKHLGr2IjAa+DswwxjSJyN+Ba4AngM/Zm/0VuAn4bZhDNBljZkcp3qTi1ILnTRjiv/gK8O/bz2Hc0Bz/868tnMItfw2eacppXQf+gednprFgaiHv7qjgutPHceP88UwIOM6c4gKW76kMOo5TEgosDUFwOeMnn5zJw2/uSPgShPNpxvnUdLzJw7QReeRmpPonrXjPHhwL4JTiAj5dMpZdR+tJcQkThuXgMwZPJ/3q//ql03jglW08smwv2ekp/v74a0tr+urHGrBqmlr8j3V44s5FejE2FcgSEQ+QDZQbY153VorIKmBMH8SX1JxacH5WcEt8YmFu0POCnPYtdSfphn5kLR6SZe+TzqSQ4wzJSW/XJ9+JIXR5YJ1/6og8BmenJ3yL3iFYrXG3x0dBdjrZ6W3nMPBnzEpLIScjlVljI78bODXFxfSR+QCMyM9kz7GOR75UvRP4u9JE37kuP+8YYw4CDwGlwCHgeEiSTwOuA17t4BCZIrJaRFaIyOVRiDkptLYa1tmtvMwu6r3OH3FgvX3lnqqgdQ6XXVII91E2I81FrdvLrqN1bCo7TkOzN+gmrdLKRg5UNeL2+KhpDGwtuchMc7H1UG27C5eJaNfReowxYW+0aQp4w+ttOSBDk0+fqmpo64mmpZvORVK6KQAuAyYANcDTIvI5Y8xf7E1+A7xrjHmvg0MUG2PKRWQi8G8R2WSMaVcQFpElwBKA4uLiHvwoieW5dQe54+kNAGSlpzB7bAGvfXQk7LYFdh/ssycP461t1o08dz67EYC0lPC14nAXpxqbrSS26Gfv+pddfNIIwLp4uODBtwH7+kBAPh+clU5aiouDNU28vf0oC6cNj/jnjCcp9g1Nz64t47QJQ/wzEo0dku0/r4HyO+lV05lxQ62+lPPGFwTdhKWi61dv7/I/zs3QnuKdieTsLAL2GmMqAETkOeBM4C8ich9QCHy5o52NMeX29z0i8g5wCtAu0RtjlgJLAUpKShK/2diFwIHKFk0fTkF2OiePHsQJI9rPdzlhWA7P3HwGk4tyKatu4mO/XOZf55QJQjlJLVDxkPaduZ0SUFlAv++XNx5iwVRrguWnbz6DEYMyueviaVz5mw86HGAt0by7s8I/1MRti6Zw3glFXPv7FQAsWTCRS04eGdSdsjtKxg/h1dvOZlBWmn8AtDMn6YQY0ZbqsnpFPffVMzvt6qoiS/SlwOkikg00AecDq0XkJuBC4HxjTNjirf1poNEY0ywiw4D5wE+iE3piC7ywmZuZisslnGXfgRpOid2bI/QOy5yQlkxnlZWs9Pat/LY+8q0hy33MmzCEU+3XHWe/SSRynb79z2iVbrLTUzkjIBFfd/o4xoZ5U+yOaSPyg8pfOiFM9Lk9Ps45odA/eqjqWCQ1+pXAM8BaYJO9z1Lg/4DhwHK76+S9ACJSIiKP2LtPx3pT2AC8DTxgjNkS/R+j79Q3e4P6QB9v8uD1tfr7YkcqtJ964KiV6b0Y4723tcnqgGQUqKKuOaj+7zyubmyhusH6ivfbzo0xVDe0+EefbPK0/R4NUO/2khGmxBWtySsCz19H51l1nzGGphYfzd5WvQgboYgKW8aY+4D7ItnXGLMaq6slxpgPgJN7E2Cs/b+/ref1LUd46db5HKxu4it2H+uScQV8acFEvvznNbz7rfMoHtpxC/DRZXv54T+38L2PzeCLZ01g/YEanlhZ6l/fmzG0QxPVaHvu0sFh+tSHmwxj2+H2A6MB7D3WwIyAspDzD/XzN3f6+y7PHjuYF26Z37PA+8Fv/7Obn7y6nUmFObx1+7m8u+OYf93L9k1SroBzP3dcAWv2V5OTHp16b+BNVTuO1LPtcC3TRoQvtanI3fviR/x5xX7SU12UjGs/IY9qT69gdOHU8UN4fcsRyqqbKA0Y1Gv1/moK7XFQNpcf7zTRO5NLl9rfncm/v3H+FM45obDbMb1063z2VTaSn5narhZ//RnjGDkok4tPGtluv0XTi3j0hhJqGj1sOnicP36wD4DbFk2hIDudI7Vu/vjBPn/f7zsuPMG/b7ia/4ay+O4bvv+YdZ53V1jnPT8rjWavj2P1ba1rZ1JvgF9eewpbymvblcN6SkR4/AvzWH+ghp+9sYOD1U2a6KPgzyus6x4t2qKPmCb6LiyeMZz7/7UVt8fX4xuG/JN+h4wZ86m5Y3pUC545ZnCHMz1lp6dymT0BRigR4fzpVo+ZT84d40/0F544wn9Rd2Jhrr830IRhOWGP43DF+Ww+gUM2+FoNzR4fp00c6m/NQ9snIIBRg7MYNTiLaFowtZDh+Zn87I0dCX19I15pt8rI6FnqgtNicHtae/yPGthX3frujFMTH6c/uBYfHzFFQ+jAYm6Pr1230/5oETrnNNHvLI5H2qKPjLbou+D0VPnO85varXtl82HAqsFfcnJwqcTXarj0f99jX2WD/2Lgi+vLeXF9edux4+SPNPDOUOdxfmbXfxq+VsPxRk/YMXZi7d4XNwfdl3Difa8BkJ4a/CkkO0xPpGhz/oZuf3oDi08c3uP++QPdZb9+n00h5cJwPclUe8nTfOsjg7LSuC9koo75k4P7RLeG6dPY0OJl2+E6ThlbwJfOnsiNZ44PWr9oelHM+/4+cn0J3710OkUBA3edNmEoty2awi8/M6fd9r+4ZjajBmVywxnj/BfB4nXWqcft/uuXzhzJredN9i+fPjKfn141i8lFudy+eCozx/R917zC3AzmTbC6qR4OmfVLRcbXathwoCZoToSvnjvJP0+v6py26CPw+fkT+J9/bcXjM1x/xji+c8l0pn3PGvFh0fQiDta0/+d1PqZfMnMk150+DsBfEwf4wvwJfR94FxbNaH+Ha05GKrctmhp2+8tmj/bX//+97Qhf+OPquC9HfLpkLOdMLfTfRXniqEHMHVfAJ+f239BMIsKSsyeyam9V3J+veBV63j4xaxR3XqSTjURKW/QRcmq7gZN2gzWeSbjJu51hhDsatzzRx0Fxzke8X2AMPf+xugYReHW5l5oAABvrSURBVK1HdV9ook+ma0n9QVv0EUpLdUGz9Q8b2O89K8zMUMt2HuO7L1g1/Y4uFiX6H2qmXRv90Stb8foMWw7Vsua7ixgaMP59oG88tY7ZYwfz+X74JBN4c1pqSLfQWF28c37fn/7dciYW5pCXmcYfbjyVIT0cZmGg+f17e4Oe60XY7knsbNOPGlusuyqdf9gfXnYi//zaWWSmufy9aBwr9lSyv6qRT80dwxkT2+r5D189C4DPnV7MlKL2Y9okEudmql1H6/0Tk7wQcKE51Ivry/mvf/TPTdF7A4YGdm6P/+lVs7jhjHH+oRz6W2BiKsrLYMOBmqA5CFTnNtoXYW9fPJWPzxrF5adobb47tEUfoZmjB7NqX5W/ZHHdGeMByFzXvkXv9vjISkvhoatmBS2/4pQxXHFKcgzbn5mWwo1njg+67tCR/h7nxfl9/PWm0/wJ9pNzx/RrXT6U00AoHpLN7RecwFX/t1zr9d3g9vg4a/Iwvnb+lFiHkpC0RR8puwIQ+pHRmdQ7cJx2Z1TEZBfpz9jfCc15vXi6DpLqaj/3rNbrIxdu7gAVOT1zEUrpYEKPzDQXrQZqm9oGzFq1t6pXA5UlitBzsXy3NU1hY4uXW/+6lre3W2O8//adjuejDXSk1s2Sx1fz3Rc2cfOf1/A//9ra7Zhe++gwD762PWx8seRc1jEYf1y3PbWu00nZlcUY6xpQPL1xJxot3UToC2dNQMSadzWQ06rdV9nArGxrWIK0FFfQ7ffJKnRANSeZ7TxSzz83HmLzweOc960i/2TcYJVxwo2bA7B2fzWvbwmefOXui6d1a9C3l9aXs7uinvNOKOxyCIf+NLYgm2vnFXPDmdYQyIV5GVTUNbOlvDZoiGTVnjOtpc+nQz33lCb6CC2eMZzFYfqdO2PEhN5uPxAmmpgxqm2ArpNHD/IPW+ycizq39SknsPtps9dHdgejQ4Z7c/T4TLu7WTvT5PExuSiXP3x+XsT79AeXS/jRlW0Duf7uurlc+ZsPBkSDoLec6R1LxutIlT0VP59tE5R/HJOAnjduT2vYqfySTeBct4HdTEN7IYWem46EW9fdRBhuPJt45Ax/Ee4eDBWsOQ6vuSQabdH3klO++M5zm7j5nIlMHZ7HwZqmoIm8k1XgxdiMNBfv7TzGB7uO8epmq1RT2dBCa6uhqqGFvIxU6pq93PnMBoblZjB9ZD7bDtfy1taj5GWmcsnJI8N2N9xb0cCsseFH6gy1fHclH+yubDdERTxyzt0/Nh7iojBDSqs2TgMgcwD8T/UVTfS95PzDHqxp4nsvfuQfN+Zoksyt2pnAAaXmTx7GezuP8dj7+zha1zYkhDOxSUaai7pmeHNr+0m4j9Y188t/7+JU+6P58PwMjtRa529daXXEif7Wv1qTwmzvYDKVeDLCngRGJw/vmvOpTgcw67mI3iJF5Jsi8pGIbBaRJ0UkU0QmiMhKEdkpIn8TkbC3+InI3SKyS0S2i8iF0Q0/9kJ7dgyEBO8ILJHcfM4k5hQPbjduvzNv6pmTOp4P1+H2tHLuCYWs/M4iPvov60+l2Rt5F8TKBuu1Qi+Yx6Os9BSuOGW0f2RT1THn7ykRSnLxqstELyKjga8DJcaYk4AU4Brgx8DDxpgpQDXwxTD7zrC3PRG4CPiNiCTVb2sg9JfvSPuupil2om9LXjV298HcCIY9dm40c45lLUveRJiZ5krqny9a/KWbAfy/1luRFr1SgSwRSQWygUPAQqxJwwH+BFweZr/LgKeMMc3GmL3ALiC+ukP00kD+4wu9OJaZlsKB6kaqGlrIsT9mf+3Jdda6CFpjO4/W+8+n0wXz4Td38OaWI/zvWzt5M6TrZUfifOIrv4zUtgHx1uyv5tdv7+JorQ5jHGrlHuv+jHi6LyLRdHnmjDEHgYeAUqwEfxxYA9QYY5y7hMqAcINPjAYOBDzvaDtEZImIrBaR1RUVFZH/BDGWnZbir7cG+nRJcgx10Jmc9BSG52fwTXtY42kj8jhS20x9s5c59nj1zvAHC6cVRXTMqoaWdstuenw1P3tjB3c+uzGiY1w5JzHOfWZair/+/D//2sqDr23n6TVlMY4q/vxnh5UPxhTEZpyiZNDl52kRKcBqmU8AaoCngYvDbBruboZwbauwdz0YY5YCSwFKSkoS5s4Il0tYfvdCwJoBZ2PZcZ79yhnMHTckxpH1vdQUFyvuPt9/Q9OdF03j9gusCcXLa5o4+ydv+7c9a8ow9v7oEloNzH/g3xyudfPGNxcwsTCXVmOYcs8rAMwd13F93RlYLhznDeUb50/hwhNH9Ppn6w+ZaS48PoOv1fjr0E0t2t0ylKfVcPaUYYwY1L5BpSITyWehRcBeY0yFMcYDPAecCQy2SzkAY4BwQxeWAWMDnne0XUITEUQkYLLsBKkdREHoXaspLiHFJWFLWiLWOgkYNyjFJaRFOFyE29MaNKZQ8LrE65nRdh2i7QK2DnTWXnPAtRvVM5H8h5UCp4tItlj/1ecDW4C3gU/Z29wAvBhm35eAa0QkQ0QmAFOAVb0POz4lSm24P0RSTw03FEJXpzCwF46v1bBqbxUr91TyUbnVTTGR+lo7sf55xX52V1hDK6/YW8mL6w/y1KpSDlQ18sHuY0HdVQcaYwzbDtcN6Gth0dBl6cYYs1JEngHWAl5gHVaJ5WXgKRH5b3vZowAi8gmsHjr3GmM+EpG/Y70xeIFbjDFJ22S54pTRrCutYWxBVqxDibnO/jGvObWYh9/cwaCs9nPmnhwwh+uVp4zmuXUHg9ZvP1zn71f/f//Z7R/ALJLXjTfOp48HXtnmX7b5YC3feGo9YPW1P1zr5qzJw/jLTafFJMZYc94AneE1VM9EdMOUMeY+4L6QxXsI04PGGPMSVkveeX4/cH8vYkwY150+jqtPHdtusK+BKLAcs+UHwbdPfP38ydx87sSg87TlBxdS7/ZSFHBh+8GrZnHHhSfgazUcqGrkM4+spDGghh3uxqhELN04zj2hkHe2t3VEOGz3wFm261i/xhVP6txW99yrBkDnhr6kd8ZGkYhokg8jtL4a7jxlp6e2G+wsxSWMGmx9Oqqot25E62rsm0Q6/6GxjhyknwRDOQOaZaVpquqNxCloqoTVnWGGO+L0wy+raux8uwTqax0a6+Ds9qUsR8UAuuMarIvSa0ur/T93Iv1e45GePdVn8jJSOxx7vrucf/TvvfhRu2WBEmmy7aE5wROpO59ewjn1/jf7Opy48tt3dnPlbz7wX69IpN9rPNLPQ6rPvP7/FkRtvthwF1nD3ah28uhB7ZbFq5NG5/OPW8/i479aBsA1p45l2og8CrLT+dLjq4MmOR9ojtW3fYJJT3Uxbmj8TCKTiDTRqz4TzZpzYJ3fmaUqdNx7iE6ZqL+ISFAvo7QUF6eOt260O33i0AGd6AObBxPjaKawRKWlG5UQAlv0zjyrB2uaYhVOnwtXlhpIXQwDR/VMpC6z8UoTvUoIGQE3Qn3xTx9SWtnIyxsPBW0T6bj18SbcRPKNze17F93/cvcnS09UgXcI50Uw8qnqnJ5BlRBcLuFPX5jHDY+toqbRwxH7btFPzhnDoulFZKWnMHV4Xoyj7Jlld53nn1/XURDm4uNA6nnjJPqfXjWr0/GPVGQ00auEcc7UQj41dwwf7DrmTwTXzBvrr2snqqK8TIpC3qOcrpbDctM5Vm+N6DmQxsFxe1qZUzyYT87VG6WiQUs3KqFkprloaPH575AdSLMONfVBom+NUq+oaHN7fFqbjyJN9Cqh5GSkcrzJw5f/vAZI3htphtqlmykBTf0PdldG9TUeX76PKd99hV1H20/KHkvj73qZ1furNdFHkZZuVEK57vRxPLXqgL/nTbImg0/OGUNqivDxmaN4edMhnllTxsq9VVF9jRfWHfSPIzS5KDeqx+6pwE8YyfomHgt6JlVCGVOQzS3nTfI/z0jSZOByCVecMobUFBeXzR7NrDGD8fo6Ho+/N+Kp9h84DPVAKsv1teT8L1FJLbAVn6wt+lCZaS5aDXh8fZDouxgorj8FXocInZNY9ZyWblTCCWzpDZRWnzPS5aHjTb0aDmDZzmN85S9rqGtu687p9sTHjVj//c8tPLJsr/95RgJNIhPv9EyqhBNYrkkfIMnA6Vd/+HjvZptaf6A6KMlD/MxTG5jkARZNHx6jSJLPwPgvUUnFKdck0LA2vTZhWDZA2PF9uiNc6z2eSjeBZhcn5p3O8ajL0o2InAD8LWDRROBe4AzgBHvZYKDGGDM7zP77gDrAB3iNMSW9jFkNcAOlLh/IKd309sJpuP3jpXQTKpHm/413XZ5JY8x2Y8xsO4nPBRqB540xVwcsfxZ4rpPDnGdvq0le9ZqTAHLTB84lJufNbfPB4706TrjW+/++tZNth2t7ddzeamzxtluWGmYMINUz3f1POR/YbYzZ7ywQa1zYTwMLoxmYUh2ZPiqfS04ewQUzRsQ6lH5TPMQq3Xh7eSdrU0v41vvNf17DO986r1fH7o3AIZmvnDOaCTr+fFR1N9FfAzwZsuxs4IgxZmcH+xjgdRExwO+MMUvDbSQiS4AlAMXFxd0MSw0k+Zlp/Oazc2MdRr9KT3WRl5na+9KN18fEYTn8+45zAbhm6XJW7Kki1gMhOOWjP31hHudMLYxxNMkn4s9GIpIOfAJ4OmTVtbRP/oHmG2PmABcDt4jIgnAbGWOWGmNKjDElhYX6i1YqVEZqSq/r6c0hY8ikuuKjPNJsv4Fpl8q+0Z0W/cXAWmPMEWeBiKQCV2LV7sMyxpTb34+KyPPAPODdnoWr1MCVkeriyVWlNLV4uXTmKBbP6H73Q7enNWhoAafn0v7KRjy+Vv724QGy01O4ck50R43ceqiWv314gDEFWYgI9W4vO47WAXD57NE8taoUGJgX2vtDdxJ9uJb7ImCbMaYs3A4ikgO4jDF19uMLgB/0KFKlBrj8rDQO1jTxwvpydlXU9zDRB7fov3jWBN7beQyA3RX1fPeFzQBRT/Tff+mjdmP1DMlJp6HZS53by8ayGgAm6LSBfSKiz0kikg0spn3PmnY1exEZJSL/sp8OB5aJyAZgFfCyMebV3oWs1MC0ZMEE/2NvD4dCcHuDE/25JxTx2I1WZ7i+7GZ5NMykKUsWTGT22MG4PT483la+eNYEBmWl9VkMA1lELXpjTCMwNMzyG8MsKwcusR/vAWb1LkSlFERnuIfQ0k3gcft7cLPMVBeZaSnUNLbg9raPS0WPnlmlEkRgS3zb4bpu7//H9/dypNbd7g3DGTzs3R0VvQuwA81eX1D3SUdmWgqZaS5KqxrxtZoBM25RLGiiVypBDAmZR7Y7s0PVNLbw/X9sodnTyswxg4LWOS3p37yz27/sWH305qfdWBb+Jq/MtBRmjy3A7WklLyOVGaPyo/aaKtjAubVQqQQ3bmh20PNmbytZ6ZG1gp2pF//rshO5dl7wfSrherpEc6CzxoBjPXHTaXz2kZX267r4yrmT+Mq5kzraVUWJtuiVShChCbk7NXVn23B18HCJPpr1+sBjBb6+jjfffzTRK5UgQm8m2nOsgWavj79/eID9le1r4IF2HLFq+uHq4OEGD9tyyBr7ZsWeSt7aeqTderCGTHa6RXbmw4BulRkDcC6BeKCJXqkEISIU5mUwpiALgGfWlLF8dyV3PruRu57d1Om+L6wrB6ypGEPlZaa1q/+/tN7a/pqlK/jin1aHbeEvePBtPvGr97uM+9/bjgJW6Wl4fqZ/+ejBWV3uq6JDa/RKJZD3v72QtBRhzg/fwONrpd6eROTQ8aZO9/O2GiYMy+HkkAuxYI2j88FdC2lq8TE4O40LHn4XX8jctKE3WgG0RDg2fqsxXDBjOEuvDx68tnho+zcd1Tc00SuVQJwZtQqy03F7fBHf5NTstZJ4R6yujilBxw6ciLw3N1O5Pa2dvrbqe1q6USoBZaSl8MHuSg7bLfl9lY1sD9O3vtnr4+3tR3lv57GIa+IuF6zYU8X2I23HW1tazUsbynlr6xHq3J6g7VfuqQx6UwDYU1FPeU0TFXXNHK516xg2MaYteqUSUKpLqGpo4Q/v7/Mvu/Dn77LvgUuDtvvnhkPc/vQGgHblmI6s2GNdPL3o5+/5l331ibX+x18/fwrzJ7XdKH/10hW8eMt8Zo1tm/rv/J/9h1GDsjjFng6wMDfDv254fgZDctqeq76nLXqlEtAPLz8JoN1E36Et6+rGFv/jry2cHJXXPt7Ywv6qxqBlNU3BrXxj4GBNEzWNHgZlpQX1lX/ttgX8/cunRyUWFRlt0SuVgIblWr1kQi+INntbg8okzQHrC7KDe9b0lNvTSui87K0dfFpwe3ycOCo/aFrAwVGKQ0VOW/RKJaCOat6Bd7Q2tfiC+rlHa9CwWreH0pAW/eay4xhj2F/ZEDSv7ZZDtVqfjwPaolcqAeVmhP/Xfe2jw1xjD3HwhT9+yPI9lf51+REOATx77GDWH+j4RqhXNh9ut+ynb+wI+u5obPExWIcejjlN9EoloNBW8kNXzeKOpzfQENCid5L8wmlF3LpwMkV5mUTiLzedxv7KBspr3IwclEl9s5d7nt/E7oq2u2/HFGTx1XMnM6Ygiw0HavjpGzv8d9MGEoHvXDq9Jz+iiiIt3SiVBD42cyQQfoya0ycOYU5xQcTHys1I5cRRg1g8YzgnjR7E6ROHcs7UoqBthuVm8JnTilkwtZAb548HoKbR0+5YC08oYliu9rCJNU30SiUBZxyc6oYW6pu9Qb1vXBJ66bT7DMEXWwPH3XE+XVQ1tKDiU5elGxE5AfhbwKKJwL3AYOBLgDNbwXeMMf8K2R0RuQj4BZACPGKMeaC3QSulrPHpqxpaSHEJYifzR5bt5ZFle4O2i3Qo486EjpGT4mp780hLcZGR6gq6wcoxfFBk5SLVt7pM9MaY7cBsABFJAQ4CzwOfBx42xjzU0b729r/Gmm+2DPhQRF4yxmyJQuxKDWh/+eJp/PqdXXz7wmkAnDlpKB/srgzaZkpRLpfPHt3r17rxzPEUD8nm7uc2cqy+hY/NHBW0fun1JeypqOfwcTdjCrJIS3HhcgkLpxV1cETVn7p7MfZ8YLcxZr9E9nFwHrDLnjsWEXkKuAzQRK9UL80Ylc+vPzPH//ycqYXtEv09l04np4MeOt2R4hIWzxjO3c9Z//cnjQ6eDeqcqYWcM7Ww16+j+kZ3a/TXAE8GPL9VRDaKyGMiEu5qz2jgQMDzMntZOyKyRERWi8jqioq+mbtSqWQWrhbfV33YtW98Yok40YtIOvAJ4Gl70W+BSVhlnUPAT8PtFmZZ2FvojDFLjTElxpiSwkJtGSjVXelhJhDJinJCnlyU0yfHVX2rO5/pLgbWGmOOADjfAUTk98A/w+xTBowNeD4GKO9BnEqpLnx81ij2Hmvg8eX7cOYNj/aE2z+6ciZvbT3in/xEJYbulG6uJaBsIyIjA9ZdAWwOs8+HwBQRmWB/IrgGeKkngSqlOjckJ53vf+JE3r3zPP+ytJTo9qCeMCyHm86eSITX6FSciOivQESysXrOPBew+CcisklENgLnAd+0tx0lIv8CMMZ4gVuB14CtwN+NMR9FMX6lVAitn6tQEZVujDGNwNCQZdd1sG05cEnA838B7frXK6X6hpPoB+kYM8qmY90olWRy0lP4yrmTOHvKsFiHouKEJnqlkoyI8O2LpsU6DBVHdKwbpZRKcprolVIqyWmiV0qpJKeJXimlkpwmeqWUSnKa6JVSKslpoldKqSSniV4ppZKcBM4tGS9EpA7Y3sVmg4DjUdimO9sNA47142tqXBpXX8YV6XaRxBXpsQZCXBC932V34hphjMkLu9YYE3dfwOoItlkajW26uV1U4uqD+DUujasv4+8yrj44FwkbVzR/l92Jq7PXTOTSzT+itE13tovmsaIZf7ReL9LtNK7ubRevcXVnu2gdS+Pq3rGiEle8lm5WG2NKYh1HKI2rezSu7tG4uide44LYxNbZa8Zri35prAPogMbVPRpX92hc3ROvcUFsYuvwNeOyRa+UUip64rVFr5RSKko00SulVJIb0IleRMaKyNsislVEPhKRb9jLh4jIGyKy0/5eYC8XEflfEdklIhtFZE7I8fJF5KCI/Cpe4hIRn4ist796NTF7lOMqFpHX7WNtEZHxsY5LRM4LOFfrRcQtIpfHOi573U/sY2y1t+nx7NxRjuvHIrLZ/rq6pzH1IrZpIrJcRJpF5I6QY10kItvtuO+Ko7geE5GjIrK5NzF1SyR9NJP1CxgJzLEf5wE7gBnAT4C77OV3AT+2H18CvAIIcDqwMuR4vwD+CvwqXuIC6uPxfAHvAIvtx7lAdjzEFXDMIUBVPMQFnAm8D6TYX8uBc+MgrkuBN7BmqssBVgP5/fw3VgScCtwP3BFwnBRgNzARSAc2ADNiHZe9bgEwB9gcrf/NLuPvrxdKhC/gRWAx1l25IwN+wdvtx78Drg3YPnC7ucBTwI30MtFHOa6oJfpoxWX/gyyLt7hCjrEEeCIe4gLOANYAWUA2VkKdHgdxfQv4bsDyR4FP9+c5C9ju+wQn+jOA1wKe3w3cHeu4ApaPpx8T/YAu3QSySwenACuB4caYQwD29yJ7s9HAgYDdyoDRIuICfor1hx83cdmPM0VktYis6E0ZIspxTQVqROQ5EVknIg+KSEocxBXoGuDJaMTU27iMMcuBt4FD9tdrxpitsY4Lq5V8sYhki8gw4DxgbDTi6kZsHYnkdxyLuGJCJwcHRCQXeBa4zRhT20n5M9wKA3wV+Jcx5kAvSqd9ERdAsTGmXEQmAv8WkU3GmN0xjisVOBvrn6UU+BvWJ6FHYxyXc5yRwMnAa72JJ1pxichkYDowxl72hogsMMa8G8u4jDGvi8ipwAdABVZJydubmHoQW4eHCLOs133JoxBXTAz4Fr2IpGH94p4wxjxnLz5i/7M7//RH7eVlBLdYxgDlWB8TbxWRfcBDwPUi8kAcxIUxxvm+B6sufkocxFUGrDPG7DHGeIEXsGqWsY7L8WngeWOMpzcxRTGuK4AVxph6Y0w9Vr389DiIC2PM/caY2caYxVjJdWdv4upBbB3p6nccq7hiYkAnervnwqPAVmPMzwJWvQTcYD++Aase5yy/3u6FcDpw3BhzyBjzWWNMsTFmPHAH8LgxpsdX+aMVl4gUiEiGfcxhwHxgS6zjAj4ECkSk0N5uYZzE5biWKJRtohhXKXCOiKTayeYcoMelmyj+faWIyFD7mDOBmcDrPY2rh7F15ENgiohMEJF0rFJcj3udRTGu2OiviwHx+AWchfVxbiOw3v66BBgKvIXVOnkLGGJvL8Cvsa7mbwJKwhzzRnrf6yYqcWH11tiEVUvdBHwxHuKy1y22j7MJ+COQHidxjQcOAq54+fvC6kHyO6zkvgX4WZzElWnHswVYAcyOwTkbgdV6rwVq7Mf59rpLsHrH7AbuiaO4nsS61uKxl/fq/zKSLx0CQSmlktyALt0opdRAoIleKaWSnCZ6pZRKcprolVIqyWmiV0qpJKeJXimlkpwmeqWUSnL/H/BvJ3g7tRHVAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用户定义的移动窗口函数\n",
    "\n",
    "# rolling_apply 函数使你能够在移动窗口上应用自己设计的数组函数\n",
    "# 唯一要求的就是：该函数要能从数组的各个片段中产生单个值（即约简）\n",
    "#     比如说， 当用 rolling(...).quantile(q) 计算样本分位数时， 可能对样本中特定值的百分等级感兴趣\n",
    "# scipy.stats.percentileofscore 函数就能达到这个目的\n",
    "\n",
    "from scipy.stats import percentileofscore\n",
    "\n",
    "score_at_2percent = lambda x: percentileofscore(x, 0.02)\n",
    "\n",
    "result = returns.AAPL.rolling(250).apply(score_at_2percent)\n",
    "\n",
    "result.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 与其他数据类型相比，时间序列数据要求不同类型的分析工具和数据转换工具"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
